- 论坛徽章:
- 36
|
回复 47# yulihua49
golang这种语言级实现的并发协程才好用,不需要去做任务线程、队列、回调之类的
传统的进程池、线程池调度开销大,goroutine开销小得多,就可以搞成池,比如
每个连接一个goroutine,然后1对1的的处理,可以写线性代码了
随便搜了两段:
- //server.go
- package main
- import (
- "fmt"
- "net"
- )
- const (
- //绑定IP地址
- ip = "127.0.0.1"
- //绑定端口号
- port = 3333
- )
- func main() {
- listen, err := net.ListenTCP("tcp", &net.TCPAddr{net.ParseIP(ip), port, ""})
- if err != nil {
- fmt.Println("监听端口失败:", err.Error())
- return
- }
- fmt.Println("已初始化连接,等待客户端连接...")
- Server(listen)
- }
- func Server(listen *net.TCPListener) {
- for {
- conn, err := listen.AcceptTCP()
- if err != nil {
- fmt.Println("接受客户端连接异常:", err.Error())
- continue
- }
- fmt.Println("客户端连接来自:", conn.RemoteAddr().String())
- defer conn.Close()
- go func() {
- data := make([]byte, 10)
- for {
- i, err := conn.Read(data)
- fmt.Println("客户端发来数据:", string(data[0:i]))
- if err != nil {
- fmt.Println("读取客户端数据错误:", err.Error())
- break
- }
- if string(data[:i]) == "exit" {
- conn.Write([]byte{'e', 'x', 'i', 't'})
- conn.Close()
- break
- }
- conn.Write(data[0:i])
- }
- }()
- }
- }
复制代码- //client.go
- package main
- import (
- "fmt"
- "net"
- )
- const (
- addr = "127.0.0.1:3333"
- )
- func main() {
- conn, err := net.Dial("tcp", addr)
- if err != nil {
- fmt.Println("连接服务端失败:", err.Error())
- return
- }
- fmt.Println("已连接服务器")
- defer conn.Close()
- Client(conn)
- }
- func Client(conn net.Conn) {
- sms := make([]byte, 1024)
- for {
- fmt.Print("请输入要发送的消息:")
- _, err := fmt.Scan(&sms)
- if err != nil {
- fmt.Println("数据输入异常:", err.Error())
- }
- conn.Write(sms)
- buf := make([]byte, 1024)
- c, err := conn.Read(buf)
- if err != nil {
- fmt.Println("读取服务器数据异常:", err.Error())
- }
- fmt.Println(string(buf[0:c]))
- }
- }
复制代码 |
|