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

Go語言實現(xiàn)服務(wù)端消息接收和發(fā)送

 更新時間:2022年07月26日 09:29:28   作者:書香水墨  
這篇文章主要為大家詳細(xì)介紹了Go語言實現(xiàn)服務(wù)端消息接收和發(fā)送功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了Go實現(xiàn)服務(wù)端消息接收和發(fā)送的具體代碼,供大家參考,具體內(nèi)容如下

一. 服務(wù)端接收數(shù)據(jù)并返回數(shù)據(jù)

服務(wù)端代碼

package main

import (
? ?"net"
? ?"fmt"
)

func main() {
? ?//創(chuàng)建TCPAddress變量,指定協(xié)議tcp4,監(jiān)聽本機8899端口
? ?addr, _ := net.ResolveTCPAddr("tcp4", "localhost:8899")

? ?//監(jiān)聽TCPAddress設(shè)定的地址
? ?lis, _ := net.ListenTCP("tcp4", addr)

? ?fmt.Println("服務(wù)器已啟動")

? ?//阻塞式等待客戶端消息,返回連接對象,用于接收客戶端消息或向客戶端發(fā)送消息
? ?conn, _ := lis.Accept()

? ?//把數(shù)據(jù)讀取到切片中
? ?b := make([]byte, 256)
? ?fmt.Println("read之前")
? ?//客戶端沒有發(fā)送數(shù)據(jù)且客戶端對象沒有關(guān)閉,Read()將會阻塞,一旦接收到數(shù)據(jù)就不阻塞
? ?count, _ := conn.Read(b)
? ?fmt.Println("接收到的數(shù)據(jù):", string(b[:count]))

? ?/*
? ?向客戶端發(fā)送數(shù)據(jù)
? ? */
? ?conn.Write([]byte("這是服務(wù)器傳遞的數(shù)據(jù)"))

? ?//關(guān)閉連接
? ?conn.Close()
? ?fmt.Println("服務(wù)器結(jié)束")
}

客戶端代碼

package main

import (
? ?"net"
? ?"fmt"
)

func main() {
? ?//服務(wù)器端ip和端口
? ?addr, _ := net.ResolveTCPAddr("tcp4", "localhost:8899")
? ?//申請連接客戶端
? ?conn, _ := net.DialTCP("tcp4", nil, addr)
? ?//向服務(wù)端發(fā)送數(shù)據(jù)
? ?count, _ := conn.Write([]byte("客戶端傳遞的數(shù)據(jù)"))
? ?fmt.Println("客戶端向服務(wù)端發(fā)送的數(shù)據(jù)量為:", count)

? ?/*
? ?接收服務(wù)器傳遞回來的數(shù)據(jù)
? ? */
? ?b := make([]byte, 256)
? ?c, _ := conn.Read(b)
? ?fmt.Println(string(b[:c]))

? ?關(guān)閉連接
? ?conn.Close()
? ?fmt.Println("客戶端結(jié)束")

}

可以在服務(wù)端添加循環(huán),不停接收客戶端發(fā)送來的數(shù)據(jù),服務(wù)端代碼修改如下

package main

import (
? ?"net"
? ?"fmt"
)

func main() {
? ?addr, _ := net.ResolveTCPAddr("tcp4", "localhost:8899")
? ?lis, _ := net.ListenTCP("tcp4", addr)
? ?fmt.Println("服務(wù)器已啟動")

? ?/*
? ?服務(wù)器端添加死循環(huán),不停的接收客戶端對象
? ? */
? ?for {
? ? ? conn, _ := lis.Accept()
? ? ? b := make([]byte, 256)
? ? ? count, _ := conn.Read(b)
? ? ? nc := string(b[:count])
? ? ? fmt.Println("接收到的數(shù)據(jù):", nc)
? ? ? conn.Write([]byte("服務(wù)器:" + nc))
? ? ? conn.Close()
? ?}
? ?fmt.Println("服務(wù)器結(jié)束")
}

客戶端代碼修改如下

package main

import (
? ?"net"
? ?"fmt"
? ?"strconv"
)

func main() {
? ?//服務(wù)器端ip和端口
? ?addr, _ := net.ResolveTCPAddr("tcp4", "localhost:8899")

? ?//通過循環(huán),模擬發(fā)送五次客戶端請求
? ?for i := 1; i <= 5; i++ {
? ? ? conn, _ := net.DialTCP("tcp4", nil, addr)
? ? ? conn.Write([]byte("客戶端數(shù)據(jù)" + strconv.Itoa(i)))
? ? ? b := make([]byte, 256)
? ? ? c, _ := conn.Read(b)
? ? ? fmt.Println("第", i, "次服務(wù)器返回的數(shù)據(jù):", string(b[:c]))
? ? ? conn.Close()
? ?}

? ?fmt.Println("客戶端結(jié)束")

}

三.并發(fā)訪問

上面代碼的問題是服務(wù)器獲取到客戶端對象后,如果客戶端什么也沒有輸入,其他客戶端無法連接.可以通過結(jié)合goroutine完成并發(fā)訪問
只需要修改server.go,在里面添加goroutine

package main

import (
? ?"net"
? ?"fmt"
)

func main() {
? ?addr, _ := net.ResolveTCPAddr("tcp4", "localhost:8899")
? ?lis, _ := net.ListenTCP("tcp4", addr)
? ?fmt.Println("服務(wù)器已啟動")

? ?/*
? ?服務(wù)器端添加死循環(huán),不停的接收客戶端對象
? ? */
? ?for {
? ? ? conn, _ := lis.Accept()
? ? ? go func() { //在此處添加創(chuàng)建go func()即可
? ? ? ? ?b := make([]byte, 256)
? ? ? ? ?count, _ := conn.Read(b)
? ? ? ? ?nc := string(b[:count])
? ? ? ? ?fmt.Println("接收到的數(shù)據(jù):", nc)
? ? ? ? ?conn.Write([]byte("服務(wù)器:" + nc))
? ? ? ? ?conn.Close()
? ? ? }()
? ?}
? ?fmt.Println("服務(wù)器結(jié)束")
}

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

相關(guān)文章

  • Golang學(xué)習(xí)筆記之安裝Go1.15版本(win/linux/macos/docker安裝)

    Golang學(xué)習(xí)筆記之安裝Go1.15版本(win/linux/macos/docker安裝)

    這篇文章主要介紹了Golang學(xué)習(xí)筆記之安裝Go1.15版本(win/linux/macos/docker安裝),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • golang順時針打印矩陣的方法示例

    golang順時針打印矩陣的方法示例

    這篇文章主要介紹了golang順時針打印矩陣的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-01-01
  • go install/build生成的文件命名和路徑操作

    go install/build生成的文件命名和路徑操作

    這篇文章主要介紹了go install/build生成的文件命名和路徑操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • golang croncli 定時器命令詳解

    golang croncli 定時器命令詳解

    定時器是執(zhí)行任務(wù)時的常用功能,配置系統(tǒng)的定時任務(wù)太麻煩,所以就想用golang簡單實現(xiàn)一個定時器命令,包括定時器命令格式、定時執(zhí)行命令的相關(guān)知識,感興趣的朋友跟隨小編一起看看吧
    2022-03-03
  • Golang實現(xiàn)Redis事務(wù)深入探究

    Golang實現(xiàn)Redis事務(wù)深入探究

    這篇文章主要介紹了Golang實現(xiàn)Redis事務(wù)深入探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-01-01
  • 詳解Golang如何比較兩個slice是否相等

    詳解Golang如何比較兩個slice是否相等

    開發(fā)中常會遇到需要比較兩個slice包含的元素是否完全相等的情況,我們通常會通過兩種方法去比較切片是否相等。這里通過幾個示例來看一下這兩種方法,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助
    2022-11-11
  • go實現(xiàn)grpc四種數(shù)據(jù)流模式

    go實現(xiàn)grpc四種數(shù)據(jù)流模式

    這篇文章主要為大家介紹了go實現(xiàn)grpc四種數(shù)據(jù)流模式,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2022-04-04
  • go語言中os包的用法實戰(zhàn)大全

    go語言中os包的用法實戰(zhàn)大全

    Go在os中提供了文件的基本操作,包括通常意義的打開、創(chuàng)建、讀寫等操作,除此以外為了追求便捷以及性能上,Go還在io/ioutil以及bufio提供一些其他函數(shù)供開發(fā)者使用,這篇文章主要給大家介紹了關(guān)于go語言中os包用法的相關(guān)資料,需要的朋友可以參考下
    2024-02-02
  • go select編譯期的優(yōu)化處理邏輯使用場景分析

    go select編譯期的優(yōu)化處理邏輯使用場景分析

    select 是 Go 中的一個控制結(jié)構(gòu),類似于用于通信的 switch 語句。每個 case 必須是一個通信操作,要么是發(fā)送要么是接收。接下來通過本文給大家介紹go select編譯期的優(yōu)化處理邏輯使用場景分析,感興趣的朋友一起看看吧
    2021-06-06
  • goalng?結(jié)構(gòu)體?方法集?接口實例詳解

    goalng?結(jié)構(gòu)體?方法集?接口實例詳解

    這篇文章主要為大家介紹了goalng?結(jié)構(gòu)體?方法集?接口實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09

最新評論