Go語言Telnet迴音伺服器的實現
阿新 • • 發佈:2020-01-19
本文介紹了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 }
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。