并发服务器实现
代码部分:
//并发服务器端
func HandlerConnect(conn net.Conn){
//运行结束后关闭,防止内存泄露
defer conn.Close()
//获取链接的客户端
addr:=conn.RemoteAddr()
fmt.Println(addr,"客户端链接成功")
//循环读取客户端发送数据
buf:=make([]byte,4096)
for {
n,err:=conn.Read(buf)
//如果客户端发出"exit+回车键"则结束程序
//回车在windows下为\r\n,在Linux和Unix下为\n
if "exit\n"==string(buf[:n]) || "exit\r\n" == string(buf[:n]){
fmt.Println("服务器接收的客户端退出请求,服务器关闭")
return
}
//如果没有读取到字符,则断开连接
if n == 0 {
fmt.Println("服务器检测到客户端已关闭,断开连接!!!")
return
}
if err!=nil {
fmt.Println("conn.Read err",err)
return
}
fmt.Println("服务器读到数据",string(buf[:n]))
//小写转大写,回发给客户端
conn.Write([]byte(strings.ToUpper(string(buf[:n]))))
}
}
//并发服务器
func main(){
//tcp协议监听ip为127.0.0.1,端口为8001
listener,err:=net.Listen("tcp","127.0.0.1:8001")
if err!=nil {
fmt.Println("net.listener err",err)
return
}
defer listener.Close()
for {
fmt.Println("服务器等待客户端连接")
conn,err:=listener.Accept()
if err!=nil {
fmt.Println("listener Accept err:",err)
return
}
//具体完成服务器和客户端的数据,启动一个go程
go HandlerConnect(conn)
}
}
并发客户端实现
//并发客户端
func main() {
//主动向ip为127.0.0.1端口为8001发起请求链接
conn,err:=net.Dial("tcp","127.0.0.1:8001")
//无法连接则打印错误
if err!=nil {
fmt.Println("net.Dial err",err)
return
}
defer conn.Close()
//获取用户从终端键盘输入(stdin),将输入数据发送给服务器
go func() {
str:=make([]byte,4096)
for {
n,err:=os.Stdin.Read(str)
if err!=nil {
fmt.Println("os.Stdin.Read err:",err)
continue
}
//将用户输入的数据发送给服务器
//写给服务器,读多少,写多少
conn.Write(str[:n])
}
}()
//回显服务器回发的大写数据
buf:=make([]byte,4096)
for {
n,err:=conn.Read(buf)
if n==0 {
fmt.Println("检测到服务器关闭,客户端也关闭")
return
}
if err!=nil {
fmt.Println("conn Read err:",err)
return
}
//打印服务器的数据返回
fmt.Println("客户端读到数据回发",string(buf[:n]))
}
}