目录
- 1、服务端
- 2、客户端
- 3、实现效果
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、实现效果
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
评论(0)