Golang基于TCP协议实现简单的server和client聊天

server.go

package main

import (
	"fmt"
	"net" // socket开发时很重要
)

func Process(conn net.Conn){
	// 循环接收客户端发送的数据
	client := conn.RemoteAddr().String()// 客户端IP:port
	defer conn.Close()// 关闭conn
	for{
		// 创建一个新的切片
		buf := make([]byte, 1024)
		// fmt.Printf("服务器在等待客户端%s发送信息\n", conn.RemoteAddr().String())
		n, err := conn.Read(buf)// 从conn中读取
		// 等待客户端通过conn发送信息,
		// 如果客户端没有发送(write),就会阻塞在这里
		if err!=nil{
			// 一般为这个err
			fmt.Printf("客户端%s已退出..\n", client)
			return
		}
		// 显示客户端发送的内容到服务器的终端
		fmt.Printf("%s: %s", client, string(buf[:n]))// 读到了n个数据
	}
}

func main(){
	fmt.Println("服务器开始监听...")
	// tcp表示使用的网络协议
	// 127.0.0.1:8888表示监听的IP:port
	listen, err := net.Listen("tcp", "127.0.0.1:8888")
	if err!=nil{
		fmt.Println("listen err =", err)
		return
	}
	defer listen.Close()// 延时关闭listen
	fmt.Println("listening success:", listen.Addr())
	
	// 循环等待客户端来连接
	fmt.Println("等待客户端来连接..")
	for{
		conn, err := listen.Accept()
		if err!=nil{
			fmt.Println("Accept() err =", err)
		}else{
			fmt.Printf("客户端%s已连接..\n", conn.RemoteAddr().String())
		}
		// 准备一个协程,为客户端服务
		go Process(conn)
	}
	
}

client.go

package main

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

func main()  {
	conn, err := net.Dial("tcp", "127.0.0.1:8888")
	if err!=nil{
		fmt.Println("client dial err =", err)
		return
	}
	defer conn.Close()// 关闭连接
	
	// 客户端发送单行数据,然后就退出
	reader := bufio.NewReader(os.Stdin)// 标准输入(终端)

	for{
		// 从终端读取一行用户输入,并发送给服务器
		fmt.Print(">")
		line, err := reader.ReadString('\n')
		if err!=nil{
			fmt.Println("reading string err =", err)
		}
		
		// 如果用户输入的是exit,客户端就退出
		line = strings.Trim(line, "\r\n")
		if line=="exit"{
			return
		}
		
		// 再将line发送给服务器
		_, err = conn.Write([]byte(line+"\n"))
		if err!=nil{
			fmt.Println("conn write err =", err)
		}
		// fmt.Printf("客户端发送了%d字节", n)
	}

效果

服务端

客户端

posted @ 2021-02-16 11:05  pangqianjin  阅读(1060)  评论(0编辑  收藏  举报