英文:
Go server not hearing remote requests
问题
我写了一个 Go 服务器,只要你从本地主机发送请求(并且发送到本地主机),它就能完美运行,但是当你尝试从浏览器(从另一台计算机)或者直接使用外部 IP 地址访问时,它就无法工作。我想要能够将其作为外部服务器访问,而不仅仅是本地访问。为什么它不能工作呢?
以下是(简化的)源代码:
package main
import (
"fmt"
"net"
"os"
)
func main() {
// 监听传入的连接。
l, err := net.Listen("tcp", "localhost:2082")
if err != nil {
fmt.Println("Error listening:", err.Error())
os.Exit(1)
}
// 应用程序关闭时关闭监听器。
defer l.Close()
for {
// 监听传入的连接。
_, err := l.Accept()
if err != nil {
fmt.Println("Error accepting: ", err.Error())
os.Exit(1)
}
fmt.Println("Incoming connection")
}
}
当你使用 curl localhost:2082
时,它会显示 "Incoming connection"。
当你使用 curl mydomain.com:2082
时,它没有任何反应。
端口已经转发了。我确定这一点,因为我从该端口运行了一个(node.js)Web 服务器,它可以正常工作。如果这相关的话,我在亚马逊 EC2 实例上运行的是 Ubuntu 12.04。
我会很感激任何帮助。谢谢!
英文:
I've written a Go server that works perfectly as long as you send it requests from localhost (and addressed to localhost), but it doesn't work when you try to access it from a browser (from a different computer) or even just directed at the external IP address. I want to be able to access it as an external server, not just locally. Why can't it?
The (pared down) source code:
package main
import (
"fmt"
"net"
"os"
)
func main() {
// Listen for incoming connections.
l, err := net.Listen("tcp", "localhost:2082")
if err != nil {
fmt.Println("Error listening:", err.Error())
os.Exit(1)
}
// Close the listener when the application closes.
defer l.Close()
for {
// Listen for an incoming connection.
_, err := l.Accept()
if err != nil {
fmt.Println("Error accepting: ", err.Error())
os.Exit(1)
}
fmt.Println("Incoming connection")
}
}
When you curl localhost:2082
, it says "Incoming connection".
When you curl mydomain.com:2082
, it does nothing.
The port is forwarded. I'm sure of this because I ran a (node.js) web server from that port, and it worked fine. If it's related, I'm running on Ubuntu 12.04 on an Amazon EC2 instance.
I'd appreciate any help. Thanks!
答案1
得分: 8
一种监听任何传入的 IP(不仅限于默认映射到 127.0.0.1 的 localhost
)的方法是:
net.Listen("tcp", ":2082")
你还可以使用 net/http/#ListenAndServe
函数,如果需要的话,可以触发监听多个特定的 IP。
go http.ListenAndServe("10.0.0.1:80", nil)
http.ListenAndServe("10.0.0.2:80", nil)
在 "A Recap of Request Handling in Go" 中可以找到一个很好的示例。
英文:
One way to listen to any incoming IP (not just localhost
, mapped by default to 127.0.0.1) would be:
net.Listen("tcp", ":2082")
You also have the function net/http/#ListenAndServe
, which allows you to trigger listen on multiple specific ip if you want.
go http.ListenAndServe("10.0.0.1:80", nil)
http.ListenAndServe("10.0.0.2:80", nil)
A good example can be seen in "A Recap of Request Handling in Go".
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论