Golang Go语言中 net 库为什么接不到其他 TCP 消息?

发布于 1周前 作者 wuwangju 来自 Go语言

以下是一个 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 := &lt;-entering:
	clients[cli] = true

case cli := &lt;-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

3 回复

用 gist ,你这代码没眼看

更多关于Golang Go语言中 net 库为什么接不到其他 TCP 消息?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


严重同意

在Golang中使用net库接收TCP消息时,如果遇到接收不到消息的问题,可能的原因及解决方案通常包括以下几个方面:

  1. 监听地址与端口配置: 确保你的服务器正确绑定到了一个可访问的IP地址和端口上。使用net.Listen("tcp", ":port")时,:port应替换为具体的端口号,且确保该端口未被其他应用占用。

  2. 连接建立: 客户端需要成功连接到服务器才能发送消息。检查客户端的连接代码,确保使用了正确的服务器地址和端口,并且连接操作没有出错。

  3. 数据读取逻辑: 服务器端的读取逻辑可能存在问题。使用conn.Read(buf)时,要确保buf足够大以存储接收的数据,且正确处理了读取操作可能返回的错误。

  4. 防火墙与安全组设置: 检查服务器所在的网络环境,包括防火墙规则和云服务的安全组设置,确保TCP端口是开放的,且没有被阻止。

  5. 数据格式与协议: 确认客户端和服务器之间的数据格式和通信协议是否一致。如果客户端发送的数据格式不符合服务器端的预期,可能会导致服务器无法正确解析数据。

  6. 错误处理: 加强错误处理逻辑,对于ListenAcceptRead等操作返回的错误进行详细的日志记录和分析。

通过上述步骤的排查,通常可以定位并解决net库接收不到TCP消息的问题。如果问题依旧存在,建议详细检查网络环境和代码逻辑,或寻求更具体的帮助。

回到顶部