Golang Go语言中 net 库为什么接不到其他 TCP 消息?
以下是一个 go 教程的聊天服务器例子,例子的 S 端 C 端都没问题。 为什么我用网络调试助手 tcp client 可以连上,但是发信息收不到呢?我在 S 端的很多位置都 fmt.Println 了都找不到。
//以下是服务端 // Copyright © 2016 Alan A. A. Donovan & Brian W. Kernighan. // License: creativecommons.org/licenses/by-nc-sa/4.0/ // See page 254. //!+ // Chat is a server that lets clients chat with each other. package main
import ( "bufio" "fmt" "log" "net" )
//!+broadcaster type client chan<- string // an outgoing message channel
var ( entering = make(chan client) leaving = make(chan client) messages = make(chan string) // all incoming client messages )
func broadcaster() { clients := make(map[client]bool) // all connected clients for { select { case msg := <-messages: // Broadcast incoming message to all // clients' outgoing message channels.
for cli := range clients {
cli <- msg
fmt.Println(msg)
}
case cli := <-entering:
clients[cli] = true
case cli := <-leaving:
delete(clients, cli)
close(cli)
}
}
}
//!-broadcaster
//!+handleConn func handleConn(conn net.Conn) { ch := make(chan string) // outgoing client messages go clientWriter(conn, ch)
who := conn.RemoteAddr().String()
ch <- "You are " + who
messages <- who + " has arrived"
entering <- ch
input := bufio.NewScanner(conn)
for input.Scan() {
messages <- who + ": " + input.Text()
fmt.Println(222)
}
// NOTE: ignoring potential errors from input.Err()
leaving <- ch
messages <- who + " has left"
conn.Close()
}
func clientWriter(conn net.Conn, ch <-chan string) { for msg := range ch { fmt.Fprintln(conn, msg) // NOTE: ignoring network errors } }
//!-handleConn
//!+main func main() { listener, err := net.Listen("tcp", "localhost:8000") if err != nil { log.Fatal(err) }
go broadcaster()
for {
conn, err := listener.Accept()
fmt.Println(111)
if err != nil {
log.Print(err)
continue
}
go handleConn(conn)
}
} //!-main
//以下是客户端 // Copyright © 2016 Alan A. A. Donovan & Brian W. Kernighan. // License: creativecommons.org/licenses/by-nc-sa/4.0/ // See page 227. // Netcat is a simple read/write client for TCP servers. package main
import ( "io" "log" "net" "os" )
//!+ func main() { conn, err := net.Dial("tcp", "localhost:8000") if err != nil { log.Fatal(err) } done := make(chan struct{}) go func() { io.Copy(os.Stdout, conn) // NOTE: ignoring errors log.Println("done") done <- struct{}{} // signal the main goroutine }() mustCopy(conn, os.Stdin) conn.Close() <-done // wait for background goroutine to finish }
//!-
func mustCopy(dst io.Writer, src io.Reader) { if _, err := io.Copy(dst, src); err != nil { log.Fatal(err) } }
Golang Go语言中 net 库为什么接不到其他 TCP 消息?
更多关于Golang Go语言中 net 库为什么接不到其他 TCP 消息?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
用 gist ,你这代码没眼看
更多关于Golang Go语言中 net 库为什么接不到其他 TCP 消息?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
严重同意
在Golang中使用net
库接收TCP消息时,如果遇到接收不到消息的问题,可能的原因及解决方案通常包括以下几个方面:
-
监听地址与端口配置: 确保你的服务器正确绑定到了一个可访问的IP地址和端口上。使用
net.Listen("tcp", ":port")
时,:port
应替换为具体的端口号,且确保该端口未被其他应用占用。 -
连接建立: 客户端需要成功连接到服务器才能发送消息。检查客户端的连接代码,确保使用了正确的服务器地址和端口,并且连接操作没有出错。
-
数据读取逻辑: 服务器端的读取逻辑可能存在问题。使用
conn.Read(buf)
时,要确保buf
足够大以存储接收的数据,且正确处理了读取操作可能返回的错误。 -
防火墙与安全组设置: 检查服务器所在的网络环境,包括防火墙规则和云服务的安全组设置,确保TCP端口是开放的,且没有被阻止。
-
数据格式与协议: 确认客户端和服务器之间的数据格式和通信协议是否一致。如果客户端发送的数据格式不符合服务器端的预期,可能会导致服务器无法正确解析数据。
-
错误处理: 加强错误处理逻辑,对于
Listen
、Accept
、Read
等操作返回的错误进行详细的日志记录和分析。
通过上述步骤的排查,通常可以定位并解决net
库接收不到TCP消息的问题。如果问题依旧存在,建议详细检查网络环境和代码逻辑,或寻求更具体的帮助。