简单TCP服务器和TCP客户端源码(Golang)

以下代码为服务端,非最终版代码,服务端可以接受多个客户端的请求,且所有消息会显示在服务端上,服务端无法发送消息:

package main

import (
    "fmt"
    "net"
)

// HandleConn 是一个协程,并发处理请求,读取用户输入。
func HandleConn(conn net.Conn) {
    address := conn.RemoteAddr().String()
    fmt.Println("接收到请求,来中:", address)
    conn.Write([]byte(conn.RemoteAddr().String() + "加入聊天室。"))
    buf := make([]byte, 1024)
    for {
        n, err := conn.Read(buf)
        if err != nil {
            fmt.Println("err", err)
            return
        }
        fmt.Println(string(buf[:n]))
        if string(buf[:n]) == "exit" {
            fmt.Println(address, "已退出聊天室。")
            return
        }
        // 可以实现自动回复消息,将收到的消息中的字母转换为大写后发送出去,去掉注释即可。
        // conn.Write([]byte(strings.ToUpper(string(buf[:n]))))
    }
}

func main() {
    listen, err := net.Listen("tcp", "127.0.0.1:8888")
    defer listen.Close()
    fmt.Println("Listening on ", listen.Addr().String())
    if err != nil {
        fmt.Println("err:", err)
        return
    }
    for {
        conn, err := listen.Accept()
        if err != nil {
            fmt.Println("err", err)
            return
        }
        go HandleConn(conn)
    }
}

  以下代码为客户端代码,输入exit即可断开与服务器的连接:

package main

import (
	"fmt"
	"net"
)

func main() {
	conn, err := net.Dial("tcp", "127.0.0.1:8888")
	go HandleRead(conn)
	if err != nil {
		fmt.Println("err=", err)
	}
	defer conn.Close()
	var abc string
	for {
		fmt.Scanln(&abc)
		conn.Write([]byte(abc))
		if abc == "exit" {
			fmt.Println("正在退出......")
			return
		}
	}

}

// HandleRead 用来阅读服务器发送的数据
func HandleRead(conn net.Conn) {
	buf := make([]byte, 1024)
	for {
		n, err := conn.Read(buf)
		if err != nil {
			fmt.Println("err:", err)
			return
		}
		fmt.Println(string(buf[:n]))
	}
}

  

posted @ 2020-10-11 22:02  人见人爱的Zain  阅读(358)  评论(0编辑  收藏  举报