Go语言Telnet回音服务器的实现

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

package main

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

func main() {

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

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

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

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

// 服务逻辑, 传入地址和退出的通道
func server(address string, exitChan chan int) {

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

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

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

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

  // 侦听循环
  for {

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

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

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

// 连接的会话逻辑
func handleSession(conn net.Conn, exitChan chan int) {

  fmt.Println("Session started:")

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

  // 接收数据的循环
  for {

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

   // 数据读取正确
   if err == nil {

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

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

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

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

}

//命令处理
func processTelnetCommand(str string, exitChan chan int) bool {

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

   fmt.Println("Session closed")

   // 告诉外部需要断开连接
   return false

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

   fmt.Println("Server shutdown")

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

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

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

  return true

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Go语言实现简单的一个静态WEB服务器

    学习Go语言的一些感受,不一定准确. 假如发生战争,JAVA一般都是充当航母战斗群的角色. 一旦出动,就是护卫舰.巡洋舰.航母舰载机.预警机.电子战飞机.潜艇等等 浩浩荡荡,杀将过去. (JVM,数十个JAR包,Tomcat中间件,SSH框架,各种配置文件...天生就是重量级的,专为大规模作战) 而GO语言更像F35战斗轰炸机 单枪匹马,悄无声息,投下炸弹然后走人. 专属轰炸机,空战也会一点点. 实在搞不定,就叫它大哥F22. (GO是编译型语言,不需要依赖,不需要虚拟机,可以调用C代码并且它足

  • golang实现http服务器处理静态文件示例

    本文实例讲述了golang实现http服务器处理静态文件的方法.分享给大家供大家参考,具体如下: 新版本更精简: 复制代码 代码如下: package main import (     "flag"     "log"     "net/http"     "os"     "io"     "path"     "strconv" ) var dir string

  • Go语言服务器开发实现最简单HTTP的GET与POST接口

    本文实例讲述了Go语言服务器开发实现最简单HTTP的GET与POST接口.分享给大家供大家参考.具体分析如下: Go语言提供了http包,可以很轻松的开发http接口.以下为示例代码: 复制代码 代码如下: package webserver    import (      "encoding/json"      "fmt"      "net/http"      "time"  )    func WebServerB

  • Go语言服务器开发之客户端向服务器发送数据并接收返回数据的方法

    本文实例讲述了Go语言服务器开发之客户端向服务器发送数据并接收返回数据的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: package mysocket    import (      "fmt"      "io"      "net"  )    func MySocketBase() {      var (          host   = "www.apache.org"         

  • Go语言实现的一个简单Web服务器

    Web是基于http协议的一个服务,Go语言里面提供了一个完善的net/http包,通过http包可以很方便的就搭建起来一个可以运行的Web服务.同时使用这个包能很简单地对Web的路由,静态文件,模版,cookie等数据进行设置和操作. http包建立Web服务器 复制代码 代码如下: package main import (     "fmt"     "net/http"     "strings"     "log"

  • go语言实现一个最简单的http文件服务器实例

    本文实例讲述了go语言实现一个最简单的http文件服务器的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: package main import (     "net/http" ) func main() {     http.Handle("/", http.FileServer(http.Dir("./")))     http.ListenAndServe(":8123", nil) } 希望本文

  • Go语言基于Socket编写服务器端与客户端通信的实例

    在golang中,网络协议已经被封装的非常完好了,想要写一个Socket的Server,我们并不用像其他语言那样需要为socket.bind.listen.receive等一系列操作头疼,只要使用Golang中自带的net包即可很方便的完成连接等操作~ 在这里,给出一个最最基础的基于Socket的Server的写法: 复制代码 代码如下: package main  import (      "fmt"      "net"      "log"

  • Go语言Telnet回音服务器的实现

    本文介绍了Go语言Telnet回音服务器,分享给大家,具体如下: package main import ( "fmt" "net" "bufio" "strings" "os" ) func main() { // 创建一个程序结束码的通道 exitChan := make(chan int) // 将服务器并发运行 go server("127.0.0.1:7001", exitCh

  • 利用C语言实现http服务器(Linux)

    目录 一.实习目的 二.实习项目及内容 2.1开发平台 2.2项目功能 2.3技能储备 三.项目设计 3.1设计概述 3.2 Reactor模式 3.3 socket网络编程 3.4 http服务器应答报文设计 四.代码实现及运行结果 4.1主要功能实现 4.2测试及运行结果 这篇文章是我的生产实习报告,在Linux操作系统上实现的一个简单的HTTP服务器,也算是一个小项目.请大家多多指教. 一.实习目的 本次实习紧紧围绕Linux操作系统基础知识展开,主要学习了Linux系统的常用命令.gcc

  • go语言实现聊天服务器的示例代码

    看了两天 go 语言,是时候练练手了. go 的 routine(例程) 和 chan(通道) 简直是神器,实现多线程(在 go 里准确的来说是 多例程)简直不要太轻松. 于是动手码了一个傻瓜版的黑框聊天器. server 端: 监听 TCP 连接:支持自定义客户端命令:支持消息分发:理论上支持广播:... package main import ( "fmt" "net" "io" "strconv" "time&

  • c语言多进程tcp服务器示例

    server.h 复制代码 代码如下: #ifndef SERVER_H#define SERVER_H#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <arpa/inet.h>#include <as

  • C 语言实现一个简单的 web 服务器的原理解析

    说到 web 服务器想必大多数人首先想到的协议是 http,那么 http 之下则是 tcp,本篇文章将通过 tcp 来实现一个简单的 web 服务器. 本篇文章将着重讲解如何实现,对于 http 与 tcp 的概念本篇将不过多讲解. 一.了解 Socket 及 web 服务工作原理 既然是基于 tcp 实现 web 服务器,很多学习 C 语言的小伙伴可能会很快的想到套接字 socket.socket 是一个较为抽象的通信进程,或者说是主机与主机进行信息交互的一种抽象.socket 可以将数据流

  • PHP保存session到memcache服务器的方法

    本文实例讲述了PHP保存session到memcache服务器的方法.分享给大家供大家参考,具体如下: 传统的 session 是写入到服务器文件中,可以在 php.ini 中看出,清单如下 session.save_handler = files session.save_path = "sess保存路径" 但是,如果网站用户很多的话,session 的访问将势必影响网站的速度.因为文件的读取速度是很低的. 众所周知,memcache 作为内存缓存服务器,通过哈希算法,把数据以key

  • 搭建SVN服务器详细教程(图文)

    本文介绍了搭建SVN服务器详细教程,分享给大家,也给自己留个笔记,具体如下: 本教程会从最基本的下载安装到上传代码,下载代码这条线来详细讲述如何完成SVN服务器的搭建 下载并安装VisualSVN server 下载并安装TortoiseSVN 导入项目 创建用户组和用户 设置权限 检出项目 下载并安装VisualSVN server 下载VisualSVN server 下载地址:https://www.visualsvn.com/server/download/ 或者参考本站下载地址,快速下

  • NodeJS 实现多语言的示例代码

    什么是多语言? 我们平时访问一些文档类型的网站时,经常可以看到页面右上角有一个下拉框用来选择当前页面支持的语言,并在选中后将整个网页的内容切换为选中的语言,这就是项目中的多语言,多语言可以根据浏览器请求发送的语言类型在服务器进行设置,也可以在请求服务器时返回多种语言,并根据权重和浏览器的支持情况进行选择和渲染. 功能描述 在本文中我们通过客户端向服务器发送请求告诉服务器客户端所支持的语言及权重,服务器检索语言包并根据客户端发送的语言类型和权重返回对应语言的内容. 在这个过程中客户端向服务器发送请

  • C#控制台程序如何发布到服务器Linux上运行

    目录 1.创建控制台程序 2.创建TCP服务端程序 3.利用vs发布程序 4.Ubuntu服务器安装.Net环境 5.解压运行tcp服务端程序 6.服务器后台运行程序 总结 1.创建控制台程序 如上图所示,选择linux开发平台,我用的VS2019,.Net5.0,一直点下一步,创建. 2.创建TCP服务端程序 using LinuxTcpApp.TcpServer; using System; using System.Net; namespace LinuxTcpApp { class Pr

  • MySQL 管理

    对于内容驱动的网站,设计好坏的关键是关系型数据库.在这个教程中,我们已经使用了MySQL关系型数据库管理系统(RDBMS)建立了我们的数据库.对于网站的开发者来说,MySQL是一个较受欢迎的选择,这不仅是因为它对于任何平台上的非商业应用都是免费的,而且也因为它的架设和使用非常的简单.正如我们在第一章中所看到的那样,根据正确的指导,一个新的用户可以在不超过30分钟的时间内架设好一个MySQL服务,并将其运行起来(对于一个有经验的用户甚至只要10分钟!). 如果你想做的仅仅是架设一个MySQL服务环

随机推荐