我使用Golang在Azure Linux VM中实现HTTP服务器。以下是简单的Golang Server代码,在端口30175上侦听。该端口上没有防火墙。
package main
import (
"fmt"
"log"
"net/http"
)
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hi there, I love %s!", r.URL.Path[1:])
}
func main() {
http.HandleFunc("/", handler)
log.Fatal(http.ListenAndServe(":30175", nil))
}
sudo netstat -tlnp的结果是:
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 1605/vsftpd
tcp 0 0 127.0.0.1:3350 0.0.0.0:* LISTEN 1873/xrdp-sesman
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1697/sshd
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 1379/cupsd
tcp 0 0 127.0.0.1:6010 0.0.0.0:* LISTEN 4879/8
tcp 0 0 127.0.0.1:6011 0.0.0.0:* LISTEN 15507/9
tcp 0 0 0.0.0.0:3389 0.0.0.0:* LISTEN 1859/xrdp
tcp 0 0 0.0.0.0:8000 0.0.0.0:* LISTEN 2112/python
tcp6 0 0 :::22 :::* LISTEN 1697/sshd
tcp6 0 0 ::1:631 :::* LISTEN 1379/cupsd
tcp6 0 0 ::1:6010 :::* LISTEN 4879/8
tcp6 0 0 ::1:6011 :::* LISTEN 15507/9
tcp6 0 0 :::30175 :::* LISTEN 46595/HttpHandler
我只能在Localhost中获得响应,但远程服务器没有响应:
curl localhost:30175
Hi there, I love !
curl serveripaddress:30175
not working
您的问题是您的服务器在TCP6堆栈上收听。尝试将TCP与" 0.0.0.0:6789"一起使用,而不是端口":6789"
这与您的代码无关。这是一个典型的防火墙问题。
- 默认情况下(在 *nix平台上)所有传入的流量都被阻止,并且允许所有传出。您需要打开操作系统上的端口,以允许传入的流量击中服务器。尝试安装
ufw
实用程序并运行sudo ufw allow 30175
- 从问题中,您的服务器似乎正在使用TCP6。理想情况下,它不应引起问题,因为TCP6应该支持IPv4和IPv6。但是我建议您将其降级到TCP,如果有道理。
您正在尝试输出到控制台。您是否尝试将其作为回复发送?
func handler(w http.ResponseWriter, r *http.Request) {
w.Write([]byte(fmt.Sprintf("Hi there, I love %s!", r.URL.Path[1:])));
}
否,如果您未指定服务器的主机部分,则服务器将在每个可用的单播地址和系统的每个可用任何广播地址上侦听。因此,我猜想解决名称或路由的问题。
这是由于Linux侦听规则所致。我的规则有拒绝所有规则。
# listen rules
sudo iptables -L INPUT --line-numbers
sudo iptables -D INPUT 8