简单版并发服务器
能够接受多个客户端的连接,并且将客户端发来的小写字符转化为大写字符发送回去,并在客户端发送exit时,断开连接。
服务端
package main
import (
"fmt"
"net"
"strings"
)
func HandleConn(conn net.Conn) {
//函数调用完,自动关闭conn
defer conn.Close()
//获取客户端的网络地址信息
addr := conn.RemoteAddr().String()
fmt.Println(addr, "connect 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]))
//windows端自动输入的\r\n要减去
if "exit" == string(buf[:n-2]) {
fmt.Println(addr, "exit")
return
}
//把数据转换为大写,在给用户发送
conn.Write([]byte(strings.ToUpper(string(buf[:n]))))
}
}
func main() {
//监听
listener, err := net.Listen("tcp", "127.0.0.1:8000")
if err != nil {
fmt.Println("err=", err)
return
}
defer listener.Close()
//阻塞等待用户连接
for {
conn, err := listener.Accept()
if err != nil {
fmt.Println("err=", err)
return
}
//处理用户请求 新建一个协程 为多个客户端服务
go HandleConn(conn)
}
}
listener, err := net.Listen("tcp", "127.0.0.1:8000")
监听连接请求conn, err := listener.Accept()
阻塞等待用户连接go HandleConn(conn)
处理用户请求 新建一个协程 为多个客户端服务addr := conn.RemoteAddr().String()
获取客户端的网络地址信息n, err := conn.Read(buf)
读取用户数据conn.Write([]byte(strings.ToUpper(string(buf[:n]))))
把数据转换为大写,在给用户发送
客户端
package main
import (
"fmt"
"net"
"os"
)
func main() {
//主动连接服务器
conn, err := net.Dial("tcp", "127.0.0.1:8000")
if err != nil {
fmt.Println("err=", err)
return
}
defer conn.Close()
go func() {
str := make([]byte, 1024)
//从键盘输入内容
for {
n, err := os.Stdin.Read(str) //从键盘读取内容放入str
if err != nil {
fmt.Println("os.Stdin. err=", err)
return
}
//把输入的内容给服务器发送
conn.Write(str[:n])
}
}()
//接受服务器回复的数据
buf := make([]byte, 1024)
for {
n, err := conn.Read(buf) //接受服务器的请求
if err != nil {
fmt.Println("err=", err)
return
}
fmt.Println(string(buf[:n])) //打印接受到的内容
}
}
net.Dial("tcp", "127.0.0.1:8000")
连接服务器os.Stdin.Read(str)
从键盘读取内容放入strconn.Write(str[:n])
把输入的内容给服务器发送conn.Read(buf)
接受服务器的请求