golang socket 编程

45 阅读1分钟

zhuanlan.zhihu.com/p/143346084

image.png

package main

import (
	"bufio"
	"fmt"
	"net"
)

func process(conn net.Conn) {
	// 处理完关闭连接
	defer conn.Close()

	// 针对当前连接做发送和接受操作
	for {
		reader := bufio.NewReader(conn)
		var buf [128]byte
		n, err := reader.Read(buf[:])
		if err != nil {
			fmt.Printf("read from conn failed, err:%v\n", err)
			break
		}

		recv := string(buf[:n])
		fmt.Printf("收到的数据:%v\n", recv)

		// 将接受到的数据返回给客户端
		_, err = conn.Write([]byte("ok"))
		if err != nil {
			fmt.Printf("write from conn failed, err:%v\n", err)
			break
		}
	}
}

func main() {
	// 建立 tcp 服务
	listen, err := net.Listen("tcp", "127.0.0.1:9090")
	if err != nil {
		fmt.Printf("listen failed, err:%v\n", err)
		return
	}

	for {
		// 等待客户端建立连接
		conn, err := listen.Accept()
		if err != nil {
			fmt.Printf("accept failed, err:%v\n", err)
			continue
		}
		// 启动一个单独的 goroutine 去处理连接
		go process(conn)
	}
}

客户端

func main() {
    // 连接到TCP服务器  
    conn, err := net.Dial("tcp", "localhost:8080")
    if err != nil {
       fmt.Fprintf(os.Stderr, "无法连接到服务器: %v\n", err)
       os.Exit(1)
    }
    defer conn.Close()

    // 使用bufio.NewReader来包装conn,以便于读取  
    reader := bufio.NewReader(conn)

    // 无限循环读取数据  
    for {
       // 读取一行数据,'\n'为分隔符  
       line, err := reader.ReadString('\n')
       if err != nil {
          // 检查是否是EOF错误,如果是,则正常退出  
          if err == io.EOF {
             break
          }
          fmt.Fprintf(os.Stderr, "读取数据时出错: %v\n", err)
          os.Exit(1)
       }
       // 去除末尾的换行符  
       fmt.Print(line[:len(line)-1])
    }

    fmt.Println("连接已关闭")
}