TCP/IP协议族是互联网通信的基础,就像现实世界的邮政系统一样,负责数据的可靠传输。
TCP/IP四层模型(类比快递系统):
TCP vs UDP 核心区别:
TCP连接建立过程 - 就像确认双方都能正常沟通:

为什么需要三次握手?
PS: TCP四次挥手
端口的作用 - 就像公司的分机号,员工号:
聊天室服务器架构:
package main
import (
"fmt"
"net"
"sync"
)
type ChatRoom struct {
clients map[net.Conn]string
mutex sync.RWMutex
}
func NewChatRoom() *ChatRoom {
return &ChatRoom{
clients: make(map[net.Conn]string),
}
}
func (cr *ChatRoom) broadcast(sender net.Conn, message string) {
cr.mutex.RLock()
defer cr.mutex.RUnlock()
for client := range cr.clients {
if client != sender {
client.Write([]byte(message))
}
}
}
func (cr *ChatRoom) handleConnection(conn net.Conn) {
defer conn.Close()
// 获取用户名
conn.Write([]byte("请输入你的用户名: "))
buffer := make([]byte, 1024)
n, _ := conn.Read(buffer)
username := string(buffer[:n-1]) // 去掉换行符
// 注册用户
cr.mutex.Lock()
cr.clients[conn] = username
cr.mutex.Unlock()
// 广播用户加入
cr.broadcast(conn, fmt.Sprintf("系统: %s 加入了聊天室\n", username))
for {
n, err := conn.Read(buffer)
if err != nil {
break
}
message := string(buffer[:n])
if message == "/quit\n" {
break
}
// 广播消息
fullMessage := fmt.Sprintf("%s: %s", username, message)
cr.broadcast(conn, fullMessage)
}
// 用户退出
cr.mutex.Lock()
delete(cr.clients, conn)
cr.mutex.Unlock()
cr.broadcast(conn, fmt.Sprintf("系统: %s 离开了聊天室\n", username))
}
func main() {
chatRoom := NewChatRoom()
listener, err := net.Listen("tcp", ":8888")
if err != nil {
fmt.Println("启动服务器失败:", err)
return
}
defer listener.Close()
fmt.Println("聊天室服务器启动在 :8888 端口...")
for {
conn, err := listener.Accept()
if err != nil {
fmt.Println("接受连接失败:", err)
continue
}
go chatRoom.handleConnection(conn)
}
}