• 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发送信息
    ", conn.RemoteAddr().String())
    		n, err := conn.Read(buf)// 从conn中读取
    		// 等待客户端通过conn发送信息,
    		// 如果客户端没有发送(write),就会阻塞在这里
    		if err!=nil{
    			// 一般为这个err
    			fmt.Printf("客户端%s已退出..
    ", 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已连接..
    ", 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('
    ')
    		if err!=nil{
    			fmt.Println("reading string err =", err)
    		}
    		
    		// 如果用户输入的是exit,客户端就退出
    		line = strings.Trim(line, "
    ")
    		if line=="exit"{
    			return
    		}
    		
    		// 再将line发送给服务器
    		_, err = conn.Write([]byte(line+"
    "))
    		if err!=nil{
    			fmt.Println("conn write err =", err)
    		}
    		// fmt.Printf("客户端发送了%d字节", n)
    	}
    

    效果

    服务端

    客户端

  • 相关阅读:
    WCF客户端获取服务端异常[自定义异常]
    关于VS2013 Browser Link 新功能
    MVC 单元测试xUnit初探
    ASP.NET MVC4中加入Log4Net日志记录功能
    简洁的MVC思想框架——Nancy(Session的使用)
    iOS开发之快速排序算法
    iOS开发之内购的完整流程
    ios面试数据结构与算法
    iOS开发之读取info.plist配置信息
    iOS开发之ARC与非ARC的设置
  • 原文地址:https://www.cnblogs.com/pangqianjin/p/14406273.html
Copyright © 2020-2023  润新知