Go语言如何实现Telnet回音服务器

小编给大家分享一下Go语言如何实现Telnet回音服务器,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

本文介绍了Go语言Telnet回音服务器,分享给大家,具体如下:

packagemain

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

funcmain(){

//创建一个程序结束码的通道
exitChan:=make(chanint)

//将服务器并发运行
goserver("127.0.0.1:7001",exitChan)

//通道阻塞,等待接收返回值
code:=<-exitChan

//标记程序返回值并退出
os.Exit(code)
}

//服务逻辑,传入地址和退出的通道
funcserver(addressstring,exitChanchanint){

//根据给定地址进行侦听
l,err:=net.Listen("tcp",address)

//如果侦听发生错误,打印错误并退出
iferr!=nil{
fmt.Println(err.Error())
exitChan<-1
}

//打印侦听地址,表示侦听成功
fmt.Println("listen:"+address)

//延迟关闭侦听器
deferl.Close()

//侦听循环
for{

//新连接没有到来时,Accept是阻塞的
conn,err:=l.Accept()

//发生任何的侦听错误,打印错误并退出服务器
iferr!=nil{
fmt.Println(err.Error())
continue
}

//根据连接开启会话,这个过程需要并行执行
gohandleSession(conn,exitChan)
}
}

//连接的会话逻辑
funchandleSession(connnet.Conn,exitChanchanint){

fmt.Println("Sessionstarted:")

//创建一个网络连接数据的读取器
reader:=bufio.NewReader(conn)

//接收数据的循环
for{

//读取字符串,直到碰到回车返回
str,err:=reader.ReadString('\n')

//数据读取正确
iferr==nil{

//去掉字符串尾部的回车
str=strings.TrimSpace(str)

//处理Telnet指令
if!processTelnetCommand(str,exitChan){
conn.Close()
break
}

//Echo逻辑,发什么数据,原样返回
conn.Write([]byte(str+"\r\n"))

}else{
//发生错误
fmt.Println("Sessionclosed")
conn.Close()
break
}
}

}

//命令处理
funcprocessTelnetCommand(strstring,exitChanchanint)bool{

//@close指令表示终止本次会话
ifstrings.HasPrefix(str,"@close"){

fmt.Println("Sessionclosed")

//告诉外部需要断开连接
returnfalse

//@shutdown指令表示终止服务进程
}elseifstrings.HasPrefix(str,"@shutdown"){

fmt.Println("Servershutdown")

//往通道中写入0,阻塞等待接收方处理
exitChan<-0

//告诉外部需要断开连接
returnfalse
}

//打印输入的字符串
fmt.Println(str)

returntrue

}

以上是“Go语言如何实现Telnet回音服务器”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注恰卡编程网行业资讯频道!

发布于 2021-05-30 14:05:18
分享
海报
168
上一篇:SpringBoot集成JWT如何实现token验证 下一篇:vue项目中如何实现监听手机物理返回键
目录

    忘记密码?

    图形验证码