ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## 一、概念 * Socket又称“套接字”,应用程序通常通过“套接字”向网络发出请求或者应答网络请求 * 常用的Socket类型有两种:流式Socket和数据报式Socket,流式是一种面向连接的Socket,针对于面向连接的TCP服务应用,数据报式Socket是一种无连接的Socket,针对于无连接的UDP服务应用 * IP是数字型,是32位整数,4个8位2进制数,每8位用圆点隔开,每个8位整数可以转换为0~255的十进制整数 * 端口号:0~65535 ## 二、TCP服务端代码 ~~~ package main import ( "net" "fmt" "strings" ) func main() { //创建监听,socket listener, err := net.Listen("tcp", "127.0.0.1:8888") if err != nil { fmt.Println(err) } defer listener.Close() //死循环,等待请求 for { //等待客户端连接 conn, err := listener.Accept() if err != nil { fmt.Println(err) continue } //每次开启一个子协程处理客户端请求 go ClientConn(conn) } } func ClientConn(conn net.Conn) { defer conn.Close() //取连接地址 ipAddr := conn.RemoteAddr().String() fmt.Println(ipAddr, "连接成功") //缓冲区用于读写 buf := make([]byte, 1024) for { //等待用户发送的数据 //n 接收数据长度 n, err := conn.Read(buf) if err != nil { fmt.Println(err) return } //截取客户端发送的有效数据 result := buf[:n] fmt.Printf("接收到数据来自[%s]==>[%d]:%s\n", ipAddr, n, string(result)) if "exit" == string(result) { fmt.Println(ipAddr, "退出连接") return } //给客户端回应 conn.Write([]byte(strings.ToUpper(string(result)))) } } ~~~ ## 三、 TCP客户端代码 ~~~ package main import ( "net" "fmt" ) func main() { //客户端主动连接服务端 conn, err := net.Dial("tcp", "127.0.0.1:8888") if err != nil { fmt.Println(err) return } defer conn.Close() //缓冲区 buf := make([]byte, 1024) for { fmt.Printf("请输入发送的内容:") fmt.Scan(&buf) fmt.Printf("发送的内容:%s\n", string(buf)) //发送数据 conn.Write(buf) //读数据 n, err := conn.Read(buf) if err != nil { fmt.Println(err) return } //截取数据 result := buf[:n] fmt.Printf("接收到数据[%d]:%s\n", n, string(result)) } } ~~~