go 实现简单版并发服务器
service_tcp.go
:
package main
import (
"net"
"fmt"
"strings"
)
func main() {
//监听
listener ,err := net.Listen("tcp","127.0.0.1:8000")
if err !=nil{
fmt.Println("net.Listen err = ",err)
return
}
defer listener.Close()
//接受多个用户
for{
conn,err := listener.Accept()
if err !=nil{
fmt.Println("listener.Accept err=",err)
return
}
//处理多个请求,新建一个一个协程
go HandleConn(conn)
}
}
//处理用户请求
func HandleConn(conn net.Conn) {
//函数调用完毕,自动关闭 conn
defer conn.Close()
//获取客户端的网络地址信息
addr := conn.RemoteAddr().String()
fmt.Println(addr, "conncet successful")
buf := make([]byte, 2048)
for {
//读取用户数据
n, err := conn.Read(buf)
if err != nil {
fmt.Println("err = ", err)
return
}
fmt.Printf("[%s]: %s\n", addr, string(buf[:n]))
if "exit" == string(buf[:n-1]){
fmt.Println(addr, " exit")
return
}
conn.Write([]byte(strings.ToUpper(string(buf[:n]))))
}
}
client_tcp.go
:
package main
import (
"net"
"fmt"
"os"
)
func main() {
//主动连接服务器
conn, err := net.Dial("tcp", "127.0.0.1:8000")
if err != nil {
fmt.Println("net.Dial err = ", err)
return
}
//main 调用完毕,关闭连接
defer conn.Close()
go func() {
buf := make([]byte, 2048)
for {
n, err := conn.Read(buf)
if err != nil {
fmt.Println("conn.Read err = ", err)
return
}
addr := conn.RemoteAddr().String()
fmt.Printf("from %s: 服务器应答消息内容: %s", addr, string(buf[:n])) //打印接收到的内容, 转换为字符串再打印
}
}()
//获取键盘输入的内容
str := make([]byte, 2048)
for {
n, err := os.Stdin.Read(str) //从键盘读取内容, 放在str
if err != nil {
fmt.Println("os.Stdin. err = ", err)
return
}
if "exit" == string(str[:n-1]){
return
}
//把输入的内容给服务器发送
conn.Write(str[:n])
}
}
效果:
服务端:
客户端:
交互效果
最后附上 github 地址
: link
本作品采用《CC 协议》,转载必须注明作者和本文链接
by JeffreyBool blog :point_right: link