server.go
package main
import (
"fmt"
"net" // socket开发时很重要
)
func Process(conn net.Conn){
// 循环接收客户端发送的数据
client := conn.RemoteAddr().String()// 客户端IP:port
defer conn.Close()// 关闭conn
for{
// 创建一个新的切片
buf := make([]byte, 1024)
// fmt.Printf("服务器在等待客户端%s发送信息
", conn.RemoteAddr().String())
n, err := conn.Read(buf)// 从conn中读取
// 等待客户端通过conn发送信息,
// 如果客户端没有发送(write),就会阻塞在这里
if err!=nil{
// 一般为这个err
fmt.Printf("客户端%s已退出..
", client)
return
}
// 显示客户端发送的内容到服务器的终端
fmt.Printf("%s: %s", client, string(buf[:n]))// 读到了n个数据
}
}
func main(){
fmt.Println("服务器开始监听...")
// tcp表示使用的网络协议
// 127.0.0.1:8888表示监听的IP:port
listen, err := net.Listen("tcp", "127.0.0.1:8888")
if err!=nil{
fmt.Println("listen err =", err)
return
}
defer listen.Close()// 延时关闭listen
fmt.Println("listening success:", listen.Addr())
// 循环等待客户端来连接
fmt.Println("等待客户端来连接..")
for{
conn, err := listen.Accept()
if err!=nil{
fmt.Println("Accept() err =", err)
}else{
fmt.Printf("客户端%s已连接..
", conn.RemoteAddr().String())
}
// 准备一个协程,为客户端服务
go Process(conn)
}
}
client.go
package main
import (
"fmt"
"net"
"bufio"
"os"
"strings"
)
func main() {
conn, err := net.Dial("tcp", "127.0.0.1:8888")
if err!=nil{
fmt.Println("client dial err =", err)
return
}
defer conn.Close()// 关闭连接
// 客户端发送单行数据,然后就退出
reader := bufio.NewReader(os.Stdin)// 标准输入(终端)
for{
// 从终端读取一行用户输入,并发送给服务器
fmt.Print(">")
line, err := reader.ReadString('
')
if err!=nil{
fmt.Println("reading string err =", err)
}
// 如果用户输入的是exit,客户端就退出
line = strings.Trim(line, "
")
if line=="exit"{
return
}
// 再将line发送给服务器
_, err = conn.Write([]byte(line+"
"))
if err!=nil{
fmt.Println("conn write err =", err)
}
// fmt.Printf("客户端发送了%d字节", n)
}
效果
服务端
![](https://img2020.cnblogs.com/blog/2261524/202102/2261524-20210216110439803-217426235.png)
客户端
![](https://img2020.cnblogs.com/blog/2261524/202102/2261524-20210216110500889-932051521.png)