Go語(yǔ)言實(shí)現(xiàn)服務(wù)端消息接收和發(fā)送
本文實(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í)有所幫助,也希望大家多多支持腳本之家。
- golang實(shí)現(xiàn)簡(jiǎn)單的udp協(xié)議服務(wù)端與客戶端示例
- Golang實(shí)現(xiàn)的聊天程序服務(wù)端和客戶端代碼分享
- go語(yǔ)言實(shí)現(xiàn)http服務(wù)端與客戶端的例子
- go標(biāo)準(zhǔn)庫(kù)net/http服務(wù)端的實(shí)現(xiàn)示例
- Golang原生rpc(rpc服務(wù)端源碼解讀)
- Go?gRPC服務(wù)端流式RPC教程示例
- go微服務(wù)PolarisMesh源碼解析服務(wù)端啟動(dòng)流程
- Go語(yǔ)言編寫一個(gè)簡(jiǎn)易聊天室服務(wù)端的實(shí)現(xiàn)
相關(guān)文章
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í)現(xiàn)Redis事務(wù)深入探究
這篇文章主要介紹了Golang實(shí)現(xiàn)Redis事務(wù)深入探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01
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在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)景分析
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í)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09

