Go語言實(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)聽本機(jī)8899端口
? ?addr, _ := net.ResolveTCPAddr("tcp4", "localhost:8899")
? ?//監(jiān)聽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之前")
? ?//客戶端沒有發(fā)送數(shù)據(jù)且客戶端對(duì)象沒有關(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ù)器傳遞回來的數(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ù)器已啟動(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")
? ?//通過循環(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ù)器獲取到客戶端對(duì)象后,如果客戶端什么也沒有輸入,其他客戶端無法連接.可以通過結(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ù)器已啟動(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é)束")
}以上就是本文的全部內(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安裝),本文給大家介紹的非常詳細(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 select編譯期的優(yōu)化處理邏輯使用場(chǎng)景分析
select 是 Go 中的一個(gè)控制結(jié)構(gòu),類似于用于通信的 switch 語句。每個(gè) case 必須是一個(gè)通信操作,要么是發(fā)送要么是接收。接下來通過本文給大家介紹go select編譯期的優(yōu)化處理邏輯使用場(chǎng)景分析,感興趣的朋友一起看看吧2021-06-06
goalng?結(jié)構(gòu)體?方法集?接口實(shí)例詳解
這篇文章主要為大家介紹了goalng?結(jié)構(gòu)體?方法集?接口實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09

