package mainimport ("fmt""net"
)func connProcess(conn net.Conn, deal func(str string) string) {for {buffer := make([]byte, 1024)n, err := conn.Read(buffer)if err != nil {logT.Error("读取客户端消息失败:" + err.Error())return}msg := string(buffer[:n])// 客户端主动关闭if msg == "exit" {_ = conn.Close()return}// 处理消息rst := deal(msg)// 服务端主动关闭if rst == "exit" {_ = conn.Close()return}// 向客户端发送确认收到的消息_, err = conn.Write([]byte(rst))if err != nil {logT.Error("向客户端发送确认消息失败:" + err.Error())return}}
}func ReceiveMsg(ln net.Listener, deal func(str string) string) {for {// 接受客户端连接conn, err := ln.Accept()if err != nil {logT.Error("接受连接失败:" + err.Error())return} else {logT.Log(fmt.Sprintf("accept success ip是=%v\n", conn.RemoteAddr()))}go connProcess(conn, deal)}
}func NewServer(port int) net.Listener {ln, err := net.Listen("tcp", fmt.Sprintf(":%d", port))if err != nil {logT.Error("监听端口失败:" + err.Error())return nil}return ln
}func SendMsg(conn net.Conn, msg string) string {// 发送消息给服务端_, err := conn.Write([]byte(msg))if err != nil {logT.Error("发送消息失败:" + err.Error())return ""}// 读取服务端返回的确认消息buffer := make([]byte, 1024)n, err := conn.Read(buffer)if err != nil {logT.Error("读取服务端返回的消息失败:" + err.Error())return ""}ack := string(buffer[:n])return ack
}func NewClient(address string, port int) net.Conn {// 连接服务端conn, err := net.Dial("tcp", fmt.Sprintf("%s:%d", address, port))if err != nil {logT.Error("连接服务端失败:" + err.Error())return nil}return conn
}
package mainimport ("fmt""testing""time"
)func TestServer(t *testing.T) {ln := NewServer(8080)go ReceiveMsg(ln, func(msg string) string {return "Server Receive: " + msg})time.Sleep(time.Second * 3)client1 := NewClient("127.0.0.1", 8080)client2 := NewClient("127.0.0.1", 8080)client3 := NewClient("127.0.0.1", 8080)fmt.Println(SendMsg(client1, "hello1"))fmt.Println(SendMsg(client2, "hello2"))fmt.Println(SendMsg(client3, "hello3"))time.Sleep(time.Second * 10)
}
(logT 是本地封装的日志包)