欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Go語言Telnet回音服務(wù)器的實(shí)現(xiàn)

 更新時(shí)間:2020年01月18日 09:09:18   作者:huang_he_  
這篇文章主要介紹了Go語言Telnet回音服務(wù)器的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

本文介紹了Go語言Telnet回音服務(wù)器,分享給大家,具體如下:

package main

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

func main() {

  // 創(chuàng)建一個(gè)程序結(jié)束碼的通道
  exitChan := make(chan int)

  // 將服務(wù)器并發(fā)運(yùn)行
  go server("127.0.0.1:7001", exitChan)

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

  // 標(biāo)記程序返回值并退出
  os.Exit(code)
}

// 服務(wù)邏輯, 傳入地址和退出的通道
func server(address string, exitChan chan int) {

  // 根據(jù)給定地址進(jìn)行偵聽
  l, err := net.Listen("tcp", address)

  // 如果偵聽發(fā)生錯(cuò)誤, 打印錯(cuò)誤并退出
  if err != nil {
   fmt.Println(err.Error())
   exitChan <- 1
  }

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

  // 延遲關(guān)閉偵聽器
  defer l.Close()

  // 偵聽循環(huán)
  for {

   // 新連接沒有到來時(shí), Accept是阻塞的
   conn, err := l.Accept()

   // 發(fā)生任何的偵聽錯(cuò)誤, 打印錯(cuò)誤并退出服務(wù)器
   if err != nil {
     fmt.Println(err.Error())
     continue
   }

   // 根據(jù)連接開啟會(huì)話, 這個(gè)過程需要并行執(zhí)行
   go handleSession(conn, exitChan)
  }
}

// 連接的會(huì)話邏輯
func handleSession(conn net.Conn, exitChan chan int) {

  fmt.Println("Session started:")

  // 創(chuàng)建一個(gè)網(wǎng)絡(luò)連接數(shù)據(jù)的讀取器
  reader := bufio.NewReader(conn)

  // 接收數(shù)據(jù)的循環(huán)
  for {

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

   // 數(shù)據(jù)讀取正確
   if err == nil {

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

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

     // Echo邏輯, 發(fā)什么數(shù)據(jù), 原樣返回
     conn.Write([]byte(str + "\r\n"))

   } else {
     // 發(fā)生錯(cuò)誤
     fmt.Println("Session closed")
     conn.Close()
     break
   }
  }

}

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

  // @close指令表示終止本次會(huì)話
  if strings.HasPrefix(str, "@close") {

   fmt.Println("Session closed")

   // 告訴外部需要斷開連接
   return false

   // @shutdown指令表示終止服務(wù)進(jìn)程
  } else if strings.HasPrefix(str, "@shutdown") {

   fmt.Println("Server shutdown")

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

   // 告訴外部需要斷開連接
   return false
  }

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

  return true

}

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Go語言數(shù)據(jù)結(jié)構(gòu)之插入排序示例詳解

    Go語言數(shù)據(jù)結(jié)構(gòu)之插入排序示例詳解

    這篇文章主要為大家介紹了Go語言數(shù)據(jù)結(jié)構(gòu)之插入排序示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • Golang實(shí)現(xiàn)web文件共享服務(wù)的示例代碼

    Golang實(shí)現(xiàn)web文件共享服務(wù)的示例代碼

    這篇文章主要介紹了Golang實(shí)現(xiàn)web文件共享服務(wù)的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-10-10
  • Go reflect 反射原理示例詳解

    Go reflect 反射原理示例詳解

    這篇文章主要為大家介紹了Go reflect 反射原理示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • Golang關(guān)鍵字defer的用法詳解

    Golang關(guān)鍵字defer的用法詳解

    defer是Go里面的一個(gè)關(guān)鍵字,用在方法或函數(shù)前面,作為方法或函數(shù)的延遲調(diào)用。這篇文章主要為大家介紹了defer的簡單使用,需要的可以參考一下
    2023-05-05
  • golang中字符串MD5生成方式總結(jié)

    golang中字符串MD5生成方式總結(jié)

    在本篇文章里小編給大家整理的是一篇關(guān)于golang中字符串MD5生成方式總結(jié)內(nèi)容,有興趣的朋友們可以跟著學(xué)習(xí)參考下。
    2021-07-07
  • Go語言中的網(wǎng)絡(luò)編程實(shí)現(xiàn)方式

    Go語言中的網(wǎng)絡(luò)編程實(shí)現(xiàn)方式

    Go語言作為一種簡潔而強(qiáng)大的編程語言,在網(wǎng)絡(luò)編程方面表現(xiàn)尤為出色,其內(nèi)置的net包提供了豐富的網(wǎng)絡(luò)I/O基礎(chǔ)設(shè)施,支持TCP、UDP協(xié)議,以及DNS解析等功能,本文將結(jié)合實(shí)際案例,詳細(xì)介紹Go語言在網(wǎng)絡(luò)編程中的詳細(xì)用法,需要的朋友可以參考下
    2024-10-10
  • golang?MySQL實(shí)現(xiàn)對(duì)數(shù)據(jù)庫表存儲(chǔ)獲取操作示例

    golang?MySQL實(shí)現(xiàn)對(duì)數(shù)據(jù)庫表存儲(chǔ)獲取操作示例

    這篇文章主要為大家介紹了golang?MySQL實(shí)現(xiàn)對(duì)數(shù)據(jù)庫表存儲(chǔ)獲取操作示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • golang協(xié)程池設(shè)計(jì)詳解

    golang協(xié)程池設(shè)計(jì)詳解

    這篇文章主要介紹了golang協(xié)程池設(shè)計(jì)詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • go語言中如何使用select的實(shí)現(xiàn)示例

    go語言中如何使用select的實(shí)現(xiàn)示例

    本文主要介紹了go語言中如何使用select的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • go語言題解LeetCode453最小操作次數(shù)使數(shù)組元素相等

    go語言題解LeetCode453最小操作次數(shù)使數(shù)組元素相等

    這篇文章主要為大家介紹了go語言題解LeetCode453最小操作次數(shù)使數(shù)組元素相等示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12

最新評(píng)論