Golang TCP编程

/ Golang / 没有评论 / 66浏览

golang版本控制台tcp群聊

服务端

服务端主要创建tcp server,不断接收客户端的连接。

func main() {
	ln, err := net.Listen("tcp", ":5000")
	if err != nil {
		log.Fatalln(err)
	}
	for {
		conn, err := ln.Accept()
		if err != nil {
			log.Println("server accept error.", err)
		}
		join(conn)
		go handleConnection(conn)
	}
}

// 处理连接
func handleConnection(conn net.Conn) {
	defer func() {
		leave(conn)
		conn.Close()
	}()
	// 数据缓存
	data := make([]byte, 1024)
	for {
		n, err := conn.Read(data)
		if err != nil {
			log.Println("conn read error.", err)
			break
		}
		b := data[0:n]

		addr := conn.RemoteAddr().String()

		var buf bytes.Buffer
		buf.WriteString(addr)
		buf.WriteString(": ")
		buf.Write(b)
		cm.Boradcast(conn, buf.Bytes())
	}
}

客户端

客户端主要连接到服务端,通过tcp连接进行读写

const server = "139.199.33.51:5000"

var q = make(chan (int))

func main() {
	conn, err := net.Dial("tcp", server)
	if err != nil {
		color.Red("connect error. cause => %s", err)
		return
	}
	color.Green("connect server [%s] success.", server)
	go read(conn)
	go waitForInput(conn)
	<-q
	color.Yellow("client close.")
}

func read(conn net.Conn) {
	defer conn.Close()
	for {
		data := make([]byte, 1024)
		n, err := conn.Read(data)
		if err != nil {
			color.Red("read error. %s", err)
			q <- 1
			break
		}
		msg := string(data[0:n])
		color.Cyan("=> %s", msg)
	}
}

代码地址

详细代码看: github

界面展示

index

如何使用

启动服务端

cd serveer
go run main.go

启动多个客户端

cd client
go run main.go