1. 程式人生 > 程式設計 >Go語言Telnet迴音伺服器的實現

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

}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。