1、服务端
package main import ( "fmt" "net" "sync" ) type chatserver struct { clients map[string]net.conn clientsmux sync.mutex } func newchatserver() *chatserver { return &chatserver{ clients: make(map[string]net.conn), } } func (s *chatserver) broadcast(message string, sender string) { s.clientsmux.lock() defer s.clientsmux.unlock() for clientaddr, conn := range s.clients { if clientaddr != sender { fmt.fprintf(conn, "[%s]: %s\n", sender, message) } } } func (s *chatserver) handleconnection(conn net.conn) { defer conn.close() clientaddr := conn.remoteaddr().string() fmt.printf("new connection from %s\n", clientaddr) s.clientsmux.lock() s.clients[clientaddr] = conn s.clientsmux.unlock() for { buffer := make([]byte, 1024) n, err := conn.read(buffer) if err != nil { fmt.printf("error reading from %s: %v\n", clientaddr, err) break } message := string(buffer[:n]) fmt.printf("[%s]: %s\n", clientaddr, message) s.broadcast(message, clientaddr) } } func main() { server := newchatserver() listener, err := net.listen("tcp", ":8080") if err != nil { fmt.println("error:", err) return } defer listener.close() fmt.println("tcp chat server listening on :8080") for { conn, err := listener.accept() if err != nil { fmt.println("error accepting connection:", err) continue } go server.handleconnection(conn) } }
2、客户端
package main import ( "bufio" "fmt" "net" "os" ) func readmessages(conn net.conn) { reader := bufio.newreader(conn) for { message, err := reader.readstring('\n') if err != nil { fmt.println("error reading message:", err) break } fmt.print(message) } } func main() { conn, err := net.dial("tcp", "127.0.0.1:8080") if err != nil { fmt.println("error connecting to server:", err) return } defer conn.close() go readmessages(conn) for { scanner := bufio.newscanner(os.stdin) scanner.scan() message := scanner.text() _, err := conn.write([]byte(message + "\n")) if err != nil { fmt.println("error sending message:", err) break } } }
3、实现效果
到此这篇关于go语言通过tcp协议实现聊天室功能的文章就介绍到这了,更多相关go tcp实现聊天室内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论