golang中的tcp编程

1. tcp server

package main

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

func main() {
	// 1. 监听端口
	listener, err := net.Listen("tcp", "127.0.0.1:8080")
	if err != nil {
		fmt.Println("listen fail err", err)
		return
	}

	defer listener.Close()

	for {
		// 2. 接收客户端请求建立链接
		conn, err := listener.Accept()
		if err != nil {
			fmt.Println("accept fail err", err)
			continue
		}

		// 3. 创建goroutine处理链接
		go process(conn)

	}
}

func  process(conn net.Conn) {
	defer fmt.Println("conn链接关闭了")
	defer conn.Close()  // 关闭链接

	reader := bufio.NewReader(conn)
	for {
		var buf [4096]byte
		n, err := reader.Read(buf[:])  // 读取数据
		if err != nil {
			break
		}
		recvStr := string(buf[:n])
		fmt.Println("收到Client发来的数据:", recvStr)
		recvStr = "serer" + recvStr
		conn.Write([]byte(recvStr))
	}

}

  

2. tcp client

package main

import (
	"bufio"
	"fmt"
	"net"
	"os"
	"strings"
)

func main() {
	// 建立与服务器的链接
	conn, err := net.Dial("tcp", "127.0.0.1:8080")
	if err != nil {
		fmt.Println("Dial fail err", err)
		return
	}

	// 关闭链接
	defer conn.Close()

	inputReader := bufio.NewReader(os.Stdin)
	// 进行数据的收发
	for {
		input, _ := inputReader.ReadString('\n')
		inputInfo := strings.Trim(input, "\r\n")
		if strings.ToUpper(inputInfo) == "Q" {  // 如果用户输入的是q/Q就退出
			return
		}

		// 发送数据
		_, err := conn.Write([]byte(inputInfo))
		if err != nil {
			fmt.Println("Write fail err", err)
			return
		}

		// 接收数据
		buf := [4096]byte{}
		n, err := conn.Read(buf[:])
		if err != nil {
			fmt.Println("Read fail err", err)
			return
		}
		fmt.Println("收到server发来的数据:", string(buf[:n]))

	}

}

  

posted @ 2021-11-01 14:05  专职  阅读(278)  评论(0编辑  收藏  举报