目录
- 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)