socket/server.go
package main
import (
"fmt"
"io"
"net"
)
func main() {
fmt.Println("服务器开始监听端口8888...")
listen, err := net.Listen("tcp", "0.0.0.0:8888")
if err != nil {
fmt.Println("listen err:", err)
return
}
defer listen.Close()
// 接受客户端连接
for {
conn, err := listen.Accept()
if err != nil {
fmt.Println("获取连接失败:", err)
}
go func() {
defer func() {
conn.Close()
fmt.Printf("客户端%v断开连接\n", conn.RemoteAddr().String())
}()
fmt.Println("客户端建立连接:", conn.RemoteAddr().String())
for {
// 接收客户端的消息
var buf []byte = make([]byte, 1024) // 一定要初始化切片,否则无法使用变量
_, err = conn.Read(buf)
if err == io.EOF || err != nil {
fmt.Println("客户端断开~~", err)
break
} else {
fmt.Print(conn.RemoteAddr().String(), "发来消息> ", string(buf))
}
// 给 客户端反馈信息
conn.Write([]byte("我收到了你的消息,请放心"))
}
}()
}
}
socket/client.go
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 func() {
conn.Close()
fmt.Println("退出客户端")
}()
for {
// 向服务端发送消息(从标准输入获取消息)
reader := bufio.NewReader(os.Stdin)
data, err := reader.ReadString('\n')
if err != nil {
fmt.Println("获取输入失败:", err)
}
// exit 退出客户端
if strings.TrimRight(data, "\n") == "exit" { // 注意:要去除行尾的换行符
break
}
// 向服务端发送信息
_, err = conn.Write([]byte(data))
if err != nil {
fmt.Println("发送消息失败:", err)
}
// 接受服务端的反馈消息
var buf []byte = make([]byte, 1024)
_, err = conn.Read(buf)
if err != nil {
fmt.Println("获取服务端反馈失败:", err)
continue
}
fmt.Println("服务器", conn.RemoteAddr().String(), "反馈>", string(buf))
}
}
测试结果:
- 服务器端
- 客户端