目前实现了多个客户端给服务端发送消息
// server.go
package main
import (
"fmt"
"io"
"net"
)
// 客户端连接直接扔协程中
func process(conn net.Conn) {
// 关闭连接
defer conn.Close()
for {
//接收客户端的消息
buf := make([]byte, 1024) // 创建一个切片来接收客户端的消息
n, err := conn.Read(buf)
// 这个就是客户端断开连接了
if err == io.EOF {
fmt.Println(conn.RemoteAddr(), "客户端已断开连接.")
return
}
if err != nil {
fmt.Println("服务器接收消息失败: ", err)
continue
}
// 打印消息
fmt.Printf("收到消息:%v\n", string(buf[:n]))
}
}
func main() {
fmt.Println("等待客户端连接...")
listener, err := net.Listen("tcp", "0.0.0.0:8899")
if err != nil {
fmt.Println("服务器启动失败", err)
return
}
defer listener.Close()
for {
conn, err := listener.Accept()
if err != nil {
fmt.Println("连接失败: ", err)
continue
}
fmt.Printf("客户端连接成功,IP地址为: %v\n", conn.RemoteAddr())
// 连接扔到协程中去
go process(conn)
}
}
// client.go
package main
import (
"bufio"
"fmt"
"net"
"os"
"strings"
)
func main() {
conn, err := net.Dial("tcp", "127.0.0.1:8899")
if err != nil {
fmt.Println("连接服务器失败")
return
}
fmt.Println("已成功连接服务器: ", conn.RemoteAddr())
// 从标准输入接收内容
reader := bufio.NewReader(os.Stdin)
for {
// 读取终端的输入的数据
str, _ := reader.ReadString('\n')
// 处理收到的消息
str = strings.Trim(str, "\r\n")
if str == "" {
fmt.Print("消息不能为空")
continue
}
// 判断是否为exit,如果是则退出
if str == "exit" {
fmt.Println("您已退出客户端")
break
}
// 发送数据到服务器
_, err = conn.Write([]byte(str))
if err != nil {
fmt.Println("发送消息失败")
}
}
}
mark