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

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

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

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

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

服務(wù)端代碼

package main

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

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

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

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

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

? ?//把數(shù)據(jù)讀取到切片中
? ?b := make([]byte, 256)
? ?fmt.Println("read之前")
? ?//客戶端沒(méi)有發(fā)送數(shù)據(jù)且客戶端對(duì)象沒(méi)有關(guān)閉,Read()將會(huì)阻塞,一旦接收到數(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")
? ?//申請(qǐng)連接客戶端
? ?conn, _ := net.DialTCP("tcp4", nil, addr)
? ?//向服務(wù)端發(fā)送數(shù)據(jù)
? ?count, _ := conn.Write([]byte("客戶端傳遞的數(shù)據(jù)"))
? ?fmt.Println("客戶端向服務(wù)端發(fā)送的數(shù)據(jù)量為:", count)

? ?/*
? ?接收服務(wù)器傳遞回來(lái)的數(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ā)送來(lái)的數(shù)據(jù),服務(wù)端代碼修改如下

package main

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

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

? ?/*
? ?服務(wù)器端添加死循環(huán),不停的接收客戶端對(duì)象
? ? */
? ?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")

? ?//通過(guò)循環(huán),模擬發(fā)送五次客戶端請(qǐng)求
? ?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èn)

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

package main

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

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

? ?/*
? ?服務(wù)器端添加死循環(huán),不停的接收客戶端對(duì)象
? ? */
? ?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é)束")
}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(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ì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • golang順時(shí)針打印矩陣的方法示例

    golang順時(shí)針打印矩陣的方法示例

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

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

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

    golang croncli 定時(shí)器命令詳解

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

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

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

    詳解Golang如何比較兩個(gè)slice是否相等

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

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

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

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

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

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

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

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

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

最新評(píng)論