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
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。