最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Golang 實現(xiàn)Socket服務(wù)端和客戶端使用TCP協(xié)議通訊

 更新時間:2020年12月17日 11:05:12   作者:冷月醉雪  
這篇文章主要介紹了Golang 實現(xiàn)Socket服務(wù)端和客戶端使用TCP協(xié)議通訊,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

Socket服務(wù)器是網(wǎng)絡(luò)服務(wù)中常用的服務(wù)器。使用go語言實現(xiàn)這個業(yè)務(wù)場景是很容易的。

這樣的網(wǎng)絡(luò)通訊,需要一個服務(wù)端和至少一個客戶端。

我們計劃構(gòu)建一個這樣的通訊工程。服務(wù)端啟動后等待客戶端的訪問。客戶端發(fā)送一段信息給服務(wù)端。服務(wù)端接收到信息后,再回饋給客戶端一段信息。

首先要建立服務(wù)端。服務(wù)端最先要做的事情就是"建立Socket端口監(jiān)聽"。

netListen, err := net.Listen("tcp", "localhost:1024")

上面的代碼,表名監(jiān)聽的是本機端口1024,而使用的通訊協(xié)議是TCP。

當(dāng)監(jiān)聽結(jié)束,模塊任務(wù)完成后,最后要close這個netListen。

defer netListen.Close()

使用日志功能,讓服務(wù)端窗口能看到服務(wù)端已經(jīng)運行了。

Log("Waiting for clients ...")

之后使用一個for循環(huán),無盡的等待那些不知何時來訪問的客戶端信息。

for循環(huán)體內(nèi),要監(jiān)聽netListen的信息接收情況:

conn, err := netListen.Accept()

當(dāng)有來自客戶端的訪問時,接受訪問。并在服務(wù)端的日志記錄已經(jīng)有客戶端連接成功了。

Log(conn.RemoteAddr().String(), "tcp connect success")

conn.RemoteAddr().String()表示的就是遠程客戶端。

然后,我們開啟一個goroutine處理連接任務(wù)。

go handleConnection(conn)

處理過程就是接收客戶端信息和反饋給客戶端信息。

n, err := conn.Read(buffer)

conn.Write([]byte(strTemp))

服務(wù)端代碼示例

package main 
import (
  "net"
  "fmt"
  "os"
  "log"
  "time"
)
 
func main() {
  //建立socket端口監(jiān)聽
  netListen, err := net.Listen("tcp", "localhost:1024")
  CheckError(err) 
  defer netListen.Close() 
  Log("Waiting for clients ...")
 
  //等待客戶端訪問
  for{
    conn, err := netListen.Accept()   //監(jiān)聽接收
    if err != nil{
      continue    //如果發(fā)生錯誤,繼續(xù)下一個循環(huán)。
    } 
    Log(conn.RemoteAddr().String(), "tcp connect success") //tcp連接成功
    go handleConnection(conn)
  }
}
 
//處理連接
func handleConnection(conn net.Conn) {
  buffer := make([]byte, 2048)    //建立一個slice
  for{
    n, err := conn.Read(buffer)   //讀取客戶端傳來的內(nèi)容
    if err != nil{
      Log(conn.RemoteAddr().String(), "connection error: ", err)
      return   //當(dāng)遠程客戶端連接發(fā)生錯誤(斷開)后,終止此協(xié)程。
    } 
    Log(conn.RemoteAddr().String(), "receive data string:\n", string(buffer[:n]))
 
    //返回給客戶端的信息
    strTemp := "CofoxServer got msg \""+string(buffer[:n])+"\" at "+time.Now().String()
    conn.Write([]byte(strTemp))
  }
}
 
//日志處理
func Log(v ...interface{}) {
  log.Println(v...)
}
 
//錯誤處理
func CheckError(err error) {
  if err != nil{
    fmt.Fprintf(os.Stderr, "Fatal error: %s", err.Error())
  }
}

客戶端的業(yè)務(wù)邏輯是,發(fā)送信息給服務(wù)端,然后接收服務(wù)端的反饋。

conn, err := net.DialTCP("tcp", nil, tcpAddr)

用TCP協(xié)議撥號(Dial)到服務(wù)端。如果沒有發(fā)生錯誤,就說明撥通了。于是在客戶端日志記錄連接成功

fmt.Println("connection success")

然后在這個已經(jīng)通暢的連接里,進行發(fā)送和接收信息的任務(wù)。conn.Write([]byte(words))是發(fā)送信息;conn.Read(buffer)是接收信息。如果接收發(fā)生錯誤,就記錄錯誤:

Log(conn.RemoteAddr().String(), "waiting server back msg error: ", err)

并且中斷進程。

如果沒有發(fā)生錯誤,酒吧接收到的信息在日志中記錄。

Log(conn.RemoteAddr().String(), "receive server back msg: ", string(buffer[:n]))

客戶端代碼示例

package main 
import (
  "net"
  "fmt"
  "log"
  "os"
)
//發(fā)送信息
func sender(conn net.Conn) {
  words := "Hello Server!"
  conn.Write([]byte(words))
  fmt.Println("send over")
 
  //接收服務(wù)端反饋
  buffer := make([]byte, 2048) 
  n, err := conn.Read(buffer)
  if err != nil {
    Log(conn.RemoteAddr().String(), "waiting server back msg error: ", err)
    return
  }
  Log(conn.RemoteAddr().String(), "receive server back msg: ", string(buffer[:n]))
 
}
//日志
func Log(v ...interface{}) {
  log.Println(v...)
}
 
func main() {
  server := "127.0.0.1:1024"
  tcpAddr, err := net.ResolveTCPAddr("tcp4", server)
  if err != nil {
    fmt.Fprintf(os.Stderr, "Fatal error: %s", err.Error())
    os.Exit(1)
  }
  conn, err := net.DialTCP("tcp", nil, tcpAddr)
  if err != nil {
    fmt.Fprintf(os.Stderr, "Fatal error: %s", err.Error())
    os.Exit(1)
  }
 
  fmt.Println("connection success")
  sender(conn)
}

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

相關(guān)文章

  • Golang負載均衡和保活設(shè)計原理示例探究

    Golang負載均衡和?;钤O(shè)計原理示例探究

    這篇文章主要為大家介紹了Golang負載均衡和保活設(shè)計原理示例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-01-01
  • golang生成指定位數(shù)的隨機數(shù)的方法

    golang生成指定位數(shù)的隨機數(shù)的方法

    這篇文章主要介紹了golang生成指定位數(shù)的隨機數(shù)的方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • Go獲取與設(shè)置環(huán)境變量的方法詳解

    Go獲取與設(shè)置環(huán)境變量的方法詳解

    go環(huán)境變量的配置其實說真的說難也難,說不難也不難,只要配置成功過一次以后后面都很簡單,但是最好是要做好筆記,這篇文章主要給大家介紹了關(guān)于Go獲取與設(shè)置環(huán)境變量的相關(guān)資料,需要的朋友可以參考下
    2021-11-11
  • Go語言中的速率限流策略全面詳解

    Go語言中的速率限流策略全面詳解

    這篇文章主要為大家介紹了Go語言中的速率限流策略全面詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11
  • Go REFLECT Library反射類型詳解

    Go REFLECT Library反射類型詳解

    這篇文章主要為大家介紹了Go REFLECT Library反射類型詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • go語言實現(xiàn)簡單的并發(fā)網(wǎng)頁爬蟲示例

    go語言實現(xiàn)簡單的并發(fā)網(wǎng)頁爬蟲示例

    在這個章節(jié)中,我們將會結(jié)合之前的知識點,實現(xiàn)一個簡易的并發(fā)網(wǎng)頁爬蟲,我們的爬蟲會先爬取一個起始頁面,提取出所有的鏈接,然后并發(fā)地爬取這些鏈接,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2023-08-08
  • 一文教你打造一個簡易的Golang日志庫

    一文教你打造一個簡易的Golang日志庫

    這篇文章主要為大家詳細介紹了如何使用不超過130行的代碼,通過一系列g(shù)olang的特性,來打造一個簡易的golang日志庫,感興趣的小伙伴可以了解一下
    2023-06-06
  • GO中的時間操作總結(jié)(time&dateparse)

    GO中的時間操作總結(jié)(time&dateparse)

    日常開發(fā)過程中,對于時間的操作可謂是無處不在,但是想實現(xiàn)時間自由還是不簡單的,多種時間格式容易混淆,本文為大家整理了一下GO中的時間操作,有需要的可以參考下
    2023-09-09
  • 深入理解Golang中的Protocol Buffers及其應(yīng)用

    深入理解Golang中的Protocol Buffers及其應(yīng)用

    本篇文章將深入探討 Go 語言中使用 Protobuf 的基礎(chǔ)知識、常見應(yīng)用以及最佳實踐,希望能幫大家了解如何在項目中高效利用 Protobuf
    2024-11-11
  • Go語言字符串處理庫strings包詳解

    Go語言字符串處理庫strings包詳解

    本文詳細介紹了Go語言中的strings庫的使用方法,包括字符串的查找、替換、分割、比較、大小寫轉(zhuǎn)換等操作,strings庫是Go語言中非常重要且功能豐富的標(biāo)準(zhǔn)庫,幾乎涵蓋了所有字符串處理的需求
    2024-09-09

最新評論

石台县| 晋中市| 鹰潭市| 黑龙江省| 临城县| 墨脱县| 福安市| 长治县| 宿迁市| 临西县| 新疆| 邻水| 沂南县| 威信县| 安岳县| 磐石市| 景宁| 海林市| 任丘市| 永泰县| 佛教| 宁化县| 嵊泗县| 陕西省| 青冈县| 屏山县| 昆明市| 罗山县| 呼和浩特市| 通化县| 安庆市| 临高县| 竹山县| 娱乐| 梁平县| 白玉县| 渝北区| 霞浦县| 达拉特旗| 广水市| 昌吉市|