回显服务器

一、回显原理

  • 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
    
    	*/
    }
    
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小哥(xpc)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值