1. 利用tcp协议,golang源生的net包实现
话不多说,我们知道聊天室需要一个服务端和客户端,这里就令服务端为server,客户端为client
2. 新建两个go文件,分别为server.go(服务端),client.go(客户端)
server.go
package main
import (
"fmt"
"net"
)
// ProcessClient ... MulitDeal the message from client
func ProcessClient(conn net.Conn) {
//这里我们循环的介绍的客户端发送的数据
defer conn.Close() //!!!关闭连接, 很重要
for {
//创建一个新的切片
buf := make([]byte, 1024)
// 1. 等待客户端通过conn发送消息
// 2. 如果客户端没有write[发送], 那么协程就阻塞在这里
n, err := conn.Read(buf) //从conn读取
if err != nil {
fmt.Printf("server read err = %v \n", err)
return
}
// 3. 显示客户端发送的内容到服务器的终端
fmt.Println(string(buf[:n]) + "\n")
}
}
func main() {
listen, err := net.Listen("tcp", "127.0.0.1:10052")
fmt.Println("server is start ...")
defer listen.Close()
if err != nil {
fmt.Println("listen err, err is ", err.Error())
}
for {
conn, err := listen.Accept()
if err == nil {
fmt.Printf("conn is %v, addres is %v\n", conn, conn.RemoteAddr())
} else {
fmt.Println("err occur")
}
//这里准备开一个协程, 处理客户端的请求
go ProcessClient(conn)
}
}
这里我们使用net包构建了一个服务器端,监听端口,等待客户端连接
client.go
package main
import (
"bufio"
"fmt"
"net"
"os"
)
func main() {
conn, err := net.Dial("tcp", "127.0.0.1:10052")
if err != nil {
fmt.Println("link server failed, err is ", err.Error())
}
fmt.Printf("local adress is %v\n", conn.LocalAddr())
for {
//功能一: 客户端发送单行数据给服务器
reader := bufio.NewReader(os.Stdin) //os.Stdin 代表标准输入 [终端]
//从终端读取一行用户输入, 并准备发送服务器
line, err := reader.ReadString('\n')
if err != nil {
fmt.Println("readSting err = ", err)
}
if line == "exit" {
break
}
//再将line 发送给 服务器
_, err = conn.Write([]byte(line))
if err != nil {
fmt.Println("conn.Write err = ", err)
}
}
}
这里实现客户端client.go对服务端的连接,和信息的发送
3. 实现效果
client端:
server端: