回显服务器

一、回显原理

  • net.Conn 实现了针对接口Reader和Writer的函数Read([]byte) ,Write([]byte)。因此,conn可以读也可以写。

  • 创建一个TCP server

  • 等待客户端的连接

  • 如果连接成功,启动一个线程去处理这个连接

    1. 扫描来自客户端的输入
    2. 向客户端输出同样的内容
    3. 循环扫描客户端的输入
  • 循环,处理下一个客户端的连接

  • package main
    
    import (
    	"bufio"
    	"fmt"
    	"log"
    	"net"
    )
    
    func echo(conn net.Conn) {
    	defer conn.Close()
    	//先将关闭连接压入栈底
    	for { //死循环保证能够多次读写
    		reader := bufio.NewReader(conn)
    		//不仅是创建Reader,也是刷新Reader
    		data, err := reader.ReadString('\n')
    		//以\n作为输入字符串的终止符
    		if err != nil {
    			log.Fatalln("Read data Failed")
    		}
    		log.Printf("Read data: %s", data)
    		//将所读字符串打印出来
    		writer := bufio.NewWriter(conn)
    		var write_data string
    		fmt.Scanln(&write_data)
    		// 等待用户输入
    		_, err = writer.WriteString(write_data)
    		//写入输入的字符串进缓存
    		if err != nil {
    			log.Fatalln("Write data Failed")
    		}
    		writer.Flush()
    		//从缓存中写入底层io
    	}
    }
    
    func main() {
    	l, err := net.Listen("tcp", ":9999")
    	//确定监听端口
    	if err != nil {
    		log.Fatalln("The Port could be listened")
    	}
    	log.Println("正在监听 0.0.0.0:9999")
    	for {
    		conn, err := l.Accept()
    		//接受请求
    		if err != nil {
    			log.Fatalln("连接中断")
    		}
    		log.Println("已收到连接")
    		go echo(conn)
    		//将回显服务挂载
    	}
    
    	/**
    	客户端  执行 telnet localhost 9999
    				this is echo server
    		 返回
    	2022/11/03 21:34:08 正在监听 0.0.0.0:9999
    	2022/11/03 21:34:23 已收到连接
    	2022/11/03 21:34:31 Read data: this is echo server
    
    	*/
    }
    
    

你可能感兴趣的:(golang,网络协议,golang,tcp/ip,服务器)