服务器端:
package main
import (
"net"
"fmt"
"os"
)
func ServerHandleError(err error,when string) {
if err != nil {
fmt.Println(err, "net.Listen")
os.Exit(1)
}
}
func main(){
//创建链接
listener, err := net.Listen("tcp", "127.0.0.1:8080")
ServerHandleError(err,"net.Listen")
//循环接入所有客户端,得到专线链接
for{
conn, e := listener.Accept()
ServerHandleError(e,"listener.Accept()")
//开辟一条独立携程,与该客户端聊天
go ChatWith(conn)
}
}
//在专线中与客户端对话
func ChatWith(conn net.Conn) {
//创建一个消息缓冲区,创建个桶
buffer := make([]byte, 1024)
//一个完整的消息回合
for{
//先听他说什么,读取客户端发来的消息,存入缓冲区
n, err := conn.Read(buffer)
ServerHandleError(err,"conn.Read(buffer)")
//拿桶接收,消息,转换打印出来
clientMsg := string(buffer[0:n])
fmt.Printf("收到%v的消息: %s\n",conn.RemoteAddr(),clientMsg)
//如果信息里包含off 便断开会话
if clientMsg!="off"{
//在回复他 已阅,自动回复客户端消息
conn.Write([]byte("已阅:"+clientMsg))
}else {
conn.Write([]byte("拜拜:"+clientMsg))
break
}
}
//断开客户端链接
conn.Close()
fmt.Printf("客户端: %s 已经断开链接..",conn.RemoteAddr())
}
客户端:
package main
import (
"net"
"fmt"
"os"
"bufio"
)
func ClentHandleError(err error,when string) {
if err != nil {
fmt.Println(err, "net.Listen")
os.Exit(1)
}
}
func main() {
//拨号远程地址,建立tcp远程链接
conn, err := net.Dial("tcp", "127.0.0.1:8080")
ClentHandleError(err,"net.Dial")
//准备消息缓冲区
buffer := make([]byte, 1024)
//建议标准输入的读取器(就是从命令行读取用户输入)
reader := bufio.NewReader(os.Stdin)
//源源不断的收发消息
for {
//一个完整的消息回合
//接收命令行输入,每行消息
lineBytes, _, _ := reader.ReadLine()
//向服务断发送
conn.Write(lineBytes)
//接收服务端消息,存入消息缓冲区,长度是n字节,转换成字符串并且打印
n, err := conn.Read(buffer)
ClentHandleError(err,"conn.Read")
serverMsg := string(buffer[0:n])
fmt.Println("服务器: ",serverMsg)
//如果客户端说bye 就退出消息循环
if serverMsg=="bye"{
break
}
}
fmt.Println("GAME OVER!")
}
如果文章或资源对您有帮助,欢迎打赏作者。一路走来,感谢有您!
txttool.com 说一段 esp56物联 查询128 IP查询