闲无事,搞个Socket双向通迅的聊天室,也可以指定单发消息
Server.go
listen_socket, err := net.Listen("tcp4", "localhost:110")
if err != nil {
log.Println(err)
}
defer listen_socket.Close()
wg_server.Add(3)
//接受Client消息
go func() {
for {
new_conn, err := listen_socket.Accept()
clientArr[new_conn.RemoteAddr().String()] = new_conn
if err != nil {
continue
}
fmt.Println(new_conn.RemoteAddr().String() + " 上线了")
go sendClient(new_conn)
}
wg_server.Done()
}()
//广播给所有Client发消息
go func() {
for {
go clientListen()
time.Sleep(time.Second * 10)
}
wg_server.Done()
}()
//给单个Client发消息
go func() {
for {
var s string;
fmt.Print("请输入客户端标识:")
fmt.Scanf("%s", &s)
if len(s) > 0 {
go oneClientListen(s)
}
}
wg_server.Done()
}()
wg_server.Wait()
Agent.go
addr := "localhost:110"
tcpAddr, err := net.ResolveTCPAddr("tcp4", addr)
if err != nil {
log.Println(err)
log.Println("建立TcpAddr对象失败")
//退出程序
os.Exit(1)
}
connTcp, err := net.DialTCP("tcp4", nil, tcpAddr)
if err != nil {
log.Println(err)
log.Println("建立Server通迅失败")
os.Exit(1)
}
wg_client.Add(2)
//向Server发送消息
go func() {
for {
var s string;
fmt.Print("请输入要发送的消息:")
fmt.Scanf("%s", &s)
connTcp.Write([]byte(s))
}
wg_client.Done()
}()
//监听Server通知
go func() {
for {
go listenServerMessage(connTcp)
time.Sleep(time.Second * 3)
}
wg_client.Done()
}()
wg_client.Wait()
Github: Golang-Socket长连接通迅