中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Go語言如何實現Telnet回音服務器

發布時間:2021-05-28 10:18:12 來源:億速云 閱讀:213 作者:小新 欄目:編程語言

小編給大家分享一下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

}

以上是“Go語言如何實現Telnet回音服務器”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

慈溪市| 安义县| 明光市| 新绛县| 凌源市| 靖边县| 江门市| 海兴县| 福州市| 县级市| 广州市| 应用必备| 鸡泽县| 尼勒克县| 侯马市| 尉犁县| 金乡县| 名山县| 浑源县| 竹山县| 东山县| 邛崃市| 伽师县| 彝良县| 岐山县| 丹寨县| 三穗县| 天门市| 临泉县| 海兴县| 伊川县| 博兴县| 丹东市| 山西省| 宁远县| 江西省| 达拉特旗| 新竹市| 延川县| 武义县| 丰都县|