文章目录
- package main import ( “bufio” “fmt” “net” “strings” ) func handleConnection(conn net.Conn) { defer conn.Close() addr := conn.RemoteAddr().String() fmt.Println(“客户端连接:”, addr) reader := bufio.NewReader(conn) for { data, err := reader.ReadString(‘n’) if err != nil { fmt.Println(“客户端断开:”, addr) return } msg := strings.TrimSpace(data) fmt.Printf(“收到[%s]: %sn”, addr, msg) // 回复消息 response := fmt.Sprintf(“服务端收到: %sn”, msg) conn.Write([]byte(response)) } } func main() { listener, err := net.Listen(“tcp”, “:8888”) if err != nil { fmt.Println(“启动失败:”, err) return } defer listener.Close() fmt.Println(“TCP服务器已启动,监听端口 8888…”) for { conn, err := listener.Accept() if err != nil { fmt.Println(“连接失败:”, err) continue } go handleConnection(conn) } }
- package main import ( “bufio” “fmt” “net” “os” “strings” ) func main() { conn, err := net.Dial(“tcp”, “127.0.0.1:8888”) if err != nil { fmt.Println(“连接服务器失败:”, err) return } defer conn.Close() fmt.Println(“已连接到服务器。请输入消息,输入 exit 退出:”) reader := bufio.NewReader(os.Stdin) for { fmt.Print(“>> “) input, _ := reader.ReadString(‘n’) input = strings.TrimSpace(input) if input == “exit” { fmt.Println(“断开连接”) return } // 发送消息 conn.Write([]byte(input + “n”)) // 接收服务器响应 response, _ := bufio.NewReader(conn).ReadString(‘n’) fmt.Println(“服务器响应:”, strings.TrimSpace(response)) } }
目录
- 一、实战背景
- 二、实战目标
- 三、完整代码实现
- 1. TCP服务器代码(server.go)
- 2. TCP客户端代码(client.go)
- 四、运行方式
- 启动服务器
- 启动客户端(多个终端可同时运行)
- 五、关键技术点解析
- 1. net.Listen("tcp", ":8888")
- 2. listener.Accept()
- 3. 并发处理连接
- 4. bufio.NewReader(conn).ReadString('n')
- 5. 客户端 net.Dial
- 六、可扩展方向
- 七、小结
相比 HTTP 请求响应,TCP 通信更底层、更灵活,适合用在:
- 游戏服务器
- 实时聊天程序
- 长连接服务
- 数据同步服务
本案例将实现一个简单的 TCP 聊天 服务器:
- 支持多个客户端连接
- 客户端发送内容,服务器打印并回应
- 演示并发连接处理
构建一个简单的 TCP 网络程序,包含两个组件:
TCP服务器
- 启动监听指定端口
- 接收多个客户端连接
- 每条连接独立处理,读取数据并回复
TCP客户端
- 连接到服务器
- 从终端输入消息并发送
- 接收服务器返回的响应
package main
import (
"bufio"
"fmt"
"net"
"strings"
)
func handleConnection(conn net.Conn) {
defer conn.Close()
addr := conn.RemoteAddr().String()
fmt.Println("客户端连接:", addr)
reader := bufio.NewReader(conn)
for {
data, err := reader.ReadString('n')
if err != nil {
fmt.Println("客户端断开:", addr)
return
}
msg := strings.TrimSpace(data)
fmt.Printf("收到[%s]: %sn", addr, msg)
// 回复消息
response := fmt.Sprintf("服务端收到: %sn", msg)
conn.Write([]byte(response))
}
}
func main() {
listener, err := net.Listen("tcp", ":8888")
if err != nil {
fmt.Println("启动失败:", err)
return
}
defer listener.Close()
fmt.Println("TCP服务器已启动,监听端口 8888...")
for {
conn, err := listener.Accept()
if err != nil {
fmt.Println("连接失败:", err)
continue
}
go handleConnection(conn)
}
}
package main
import (
"bufio"
"fmt"
"net"
"os"
"strings"
)
func main() {
conn, err := net.Dial("tcp", "127.0.0.1:8888")
if err != nil {
fmt.Println("连接服务器失败:", err)
return
}
defer conn.Close()
fmt.Println("已连接到服务器。请输入消息,输入 exit 退出:")
reader := bufio.NewReader(os.Stdin)
for {
fmt.Print(">> ")
input, _ := reader.ReadString('n')
input = strings.TrimSpace(input)
if input == "exit" {
fmt.Println("断开连接")
return
}
// 发送消息
conn.Write([]byte(input + "n"))
// 接收服务器响应
response, _ := bufio.NewReader(conn).ReadString('n')
fmt.Println("服务器响应:", strings.TrimSpace(response))
}
}
go run server.go
输出示例:
TCP服务器已启动,监听端口 8888...
go run client.go
输入消息:
>> hello 服务器响应: 服务端收到: hello
服务器端输出:
客户端连接: 127.0.0.1:53458 收到[127.0.0.1:53458]: hello
用于监听本地 8888 端口,协议为 TCP。支持 IPv4、IPv6。
阻塞方法,等待客户端连接。每当有新连接,就返回一个 net.Conn。
使用 go handleConnection(conn),每个客户端独立处理,避免阻塞。
按行读取客户端发送内容。注意客户端必须发送换行(n)结束,否则会阻塞。
客户端使用 net.Dial("tcp", addr) 建立连接。注意服务端地址和端口应正确。
| 方向 | 实现建议 |
|---|---|
| 广播机制 | 使用 map[conn]bool 存储连接,广播消息 |
| 客户端昵称 | 每个连接输入昵称,并用于标识消息来源 |
| 心跳检测 | 定期向客户端发送 ping,判断是否掉线 |
| JSON 协议 | 使用结构化数据通讯 |
| TLS 加密通信 | 使用 crypto/tls 加密 TCP 通道 |
| 多线程聊天室 | 支持多房间并发聊天 |
通过本案例你掌握了:
- 如何编写基本的 TCP 服务端和客户端
- 使用 Goroutine 实现并发连接处理
- 使用
bufio.Reader/Writer实现按行读写 - 终端交互式发送/接收消息
这是构建分布式系统、即时通讯、远程控制服务的基础能力。
到此这篇关于使用Go创建一个TCP服务器的操作步骤的文章就介绍到这了,更多相关Go创建TCP服务器内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客!
您可能感兴趣的文章:
- GO语言实现TCP服务器的示例代码
- Golang 编写Tcp服务器的解决方案
- 在Go中构建并发TCP服务器
- Go语言服务器开发之简易TCP客户端与服务端实现方法