日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Go語言實現服務端消息接收和發送_Golang

作者:書香水墨 ? 更新時間: 2022-09-18 編程語言

本文實例為大家分享了Go實現服務端消息接收和發送的具體代碼,供大家參考,具體內容如下

一. 服務端接收數據并返回數據

服務端代碼

package main

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

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

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

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

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

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

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

? ?//關閉連接
? ?conn.Close()
? ?fmt.Println("服務器結束")
}

客戶端代碼

package main

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

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

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

? ?關閉連接
? ?conn.Close()
? ?fmt.Println("客戶端結束")

}

可以在服務端添加循環,不停接收客戶端發送來的數據,服務端代碼修改如下

package main

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

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

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

客戶端代碼修改如下

package main

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

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

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

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

}

三.并發訪問

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

package main

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

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

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

原文鏈接:https://blog.csdn.net/qq_27870421/article/details/118494098

欄目分類
最近更新