效果展示
![在这里插入图片描述](https://img-blog.csdnimg.cn/4d632ff057954ae7a8f4276c8fd68f52.png#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/af051f2ab6714e679584551a3cb6dede.png#pic_center)
服务端
package main
import (
"fmt"
"net"
"sync"
)
func main() {
port := ":9527"
tcpaddr, err := net.ResolveTCPAddr("tcp4", port)
if err != nil {
fmt.Println(err)
}
tcpListener, err := net.ListenTCP("tcp4", tcpaddr)
if err != nil {
fmt.Println(err)
}
fmt.Println("服务端聊天界面。。。。。。。。。。。。。。")
tcpConn, err := tcpListener.AcceptTCP()
if err != nil {
fmt.Println(err)
}
var wg sync.WaitGroup
wg.Add(2)
go func() {
defer wg.Done()
for {
wTcpConn := ""
fmt.Scanln(&wTcpConn)
if wTcpConn == "over" {
tcpConn.Write([]byte(wTcpConn))
break
}
tcpConn.Write([]byte(wTcpConn))
}
}()
go func() {
defer wg.Done()
for {
rTcpConn := make([]byte, 520)
lenTcpConn, err := tcpConn.Read(rTcpConn)
if err != nil || string(rTcpConn[:lenTcpConn]) == "over" {
fmt.Println("客户端说:", string(rTcpConn[:lenTcpConn]))
break
}
fmt.Println("客户端说:", string(rTcpConn[:lenTcpConn]))
}
}()
wg.Wait()
defer tcpConn.Close()
}
客户端
package main
import (
"fmt"
"net"
"sync"
)
func main() {
tcpAddr, err := net.ResolveTCPAddr("tcp4", "192.168.31.205:9527")
if err != nil {
fmt.Println(err)
}
tcpConn, err := net.DialTCP("tcp4", nil, tcpAddr)
if err != nil {
fmt.Println(err)
}
fmt.Println("客户端聊天界面。。。。。。。。。。。。。。")
var wg sync.WaitGroup
wg.Add(2)
go func() {
defer wg.Done()
for {
wTcpConn := ""
fmt.Scanln(&wTcpConn)
if wTcpConn == "over" {
tcpConn.Write([]byte(wTcpConn))
break
}
tcpConn.Write([]byte(wTcpConn))
}
}()
go func() {
defer wg.Done()
for {
rTcpConn := make([]byte, 520)
lenTcpConn, err := tcpConn.Read(rTcpConn)
if err != nil || string(rTcpConn[:lenTcpConn]) == "over" {
fmt.Println("服务端说:", string(rTcpConn[:lenTcpConn]))
break
}
fmt.Println("服务端说:", string(rTcpConn[:lenTcpConn]))
}
}()
wg.Wait()
defer tcpConn.Close()
}
GitHub源码地址