go語(yǔ)言中的udp協(xié)議及TCP通訊實(shí)現(xiàn)示例
更新時(shí)間:2022年04月14日 14:13:21 作者:Jeff的技術(shù)棧
這篇文章主要為大家介紹了go語(yǔ)言中的udp協(xié)議及TCP通訊的實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
udp協(xié)議
server端
package main
import (
"fmt"
"net"
)
func main() {
// 創(chuàng)建監(jiān)聽(tīng)
socket, err := net.ListenUDP("udp4", &net.UDPAddr{
IP: net.IPv4(0, 0, 0, 0),
Port: 8080,
})
if err != nil {
fmt.Println("監(jiān)聽(tīng)失敗!", err)
return
}
defer socket.Close()
for {
// 讀取客戶端傳來(lái)的數(shù)據(jù)
data := make([]byte, 4096)
read, remoteAddr, err := socket.ReadFromUDP(data)
if err != nil {
fmt.Println("讀取數(shù)據(jù)失敗!", err)
continue
}
fmt.Println(read, remoteAddr)
fmt.Printf("%s\n\n", data)
//發(fā)送數(shù)據(jù),告訴客戶端已收到
senddata := []byte("hello client!")
_, err = socket.WriteToUDP(senddata, remoteAddr)
if err != nil {
return
fmt.Println("發(fā)送數(shù)據(jù)失敗!", err)
}
}
}
client端
package main
import (
"fmt"
"net"
)
func main() {
// 創(chuàng)建連接
socket, err := net.DialUDP("udp4", nil, &net.UDPAddr{
IP: net.IPv4(0, 0, 0, 0),
Port: 8080,
})
if err != nil {
fmt.Println("連接失敗!", err)
return
}
defer socket.Close()
// 發(fā)送給服務(wù)端數(shù)據(jù)
senddata := []byte("hello server!")
_, err = socket.Write(senddata)
if err != nil {
fmt.Println("發(fā)送數(shù)據(jù)失敗!", err)
return
}
// 接收客戶端的數(shù)據(jù)
data := make([]byte, 4096)
read, remoteAddr, err := socket.ReadFromUDP(data)
if err != nil {
fmt.Println("讀取數(shù)據(jù)失敗!", err)
return
}
fmt.Println(read, remoteAddr)
fmt.Printf("%s\n", data)
}TCP通訊(基本)
服務(wù)端
package main
import (
"fmt"
"net"
)
func main() {
//監(jiān)聽(tīng)
listener, err := net.Listen("tcp", "127.0.0.1:8000")
if err != nil {
fmt.Println("err = ", err)
return
}
defer listener.Close()
//阻塞等待用戶鏈接
conn, err := listener.Accept()
if err != nil {
fmt.Println("err = ", err)
return
}
//接收用戶的請(qǐng)求
buf := make([]byte, 1024) //1024大小的緩沖區(qū)
n, err1 := conn.Read(buf)
if err1 != nil {
fmt.Println("err1 = ", err1)
return
}
fmt.Println("buf = ", string(buf[:n]))
defer conn.Close() //關(guān)閉當(dāng)前用戶鏈接
}
客戶端
package main
import (
"fmt"
"net"
)
func main() {
//主動(dòng)連接服務(wù)器
conn, err := net.Dial("tcp", "127.0.0.1:8000")
if err != nil {
fmt.Println("err = ", err)
return
}
defer conn.Close()
//發(fā)送數(shù)據(jù)
conn.Write([]byte("are u ok?"))
}
TCP通訊并發(fā)服務(wù)器
服務(wù)端
package main
import (
"fmt"
"net"
"strings"
)
//處理用戶請(qǐng)求
func HandleConn(conn net.Conn) {
//函數(shù)調(diào)用完畢,自動(dòng)關(guān)閉conn
defer conn.Close()
//獲取客戶端的網(wǎng)絡(luò)地址信息
addr := conn.RemoteAddr().String()
fmt.Println(addr, " conncet sucessful")
buf := make([]byte, 2048)
for {
//讀取用戶數(shù)據(jù)
n, err := conn.Read(buf)
if err != nil {
fmt.Println("err = ", err)
return
}
fmt.Printf("[%s]: %s\n", addr, string(buf[:n]))
fmt.Println("len = ", len(string(buf[:n])))
//if "exit" == string(buf[:n-1]) { //nc測(cè)試
if "exit" == string(buf[:n-2]) { //自己寫的客戶端測(cè)試, 發(fā)送時(shí),多了2個(gè)字符, "\r\n"
fmt.Println(addr, " exit")
return
}
//把數(shù)據(jù)轉(zhuǎn)換為大寫,再給用戶發(fā)送
conn.Write([]byte(strings.ToUpper(string(buf[:n]))))
}
}
func main() {
//監(jiān)聽(tīng)
listener, err := net.Listen("tcp", "127.0.0.1:8000")
if err != nil {
fmt.Println("err = ", err)
return
}
defer listener.Close()
//接收多個(gè)用戶
for {
conn, err := listener.Accept()
if err != nil {
fmt.Println("err = ", err)
return
}
//處理用戶請(qǐng)求, 新建一個(gè)協(xié)程
go HandleConn(conn)
}
}客戶端
package main
import (
"fmt"
"net"
"os"
)
func main() {
//主動(dòng)連接服務(wù)器
conn, err := net.Dial("tcp", "127.0.0.1:8000")
if err != nil {
fmt.Println("net.Dial err = ", err)
return
}
//main調(diào)用完畢,關(guān)閉連接
defer conn.Close()
go func() {
//從鍵盤輸入內(nèi)容,給服務(wù)器發(fā)送內(nèi)容
str := make([]byte, 1024)
for {
n, err := os.Stdin.Read(str) //從鍵盤讀取內(nèi)容, 放在str
if err != nil {
fmt.Println("os.Stdin. err = ", err)
return
}
//把輸入的內(nèi)容給服務(wù)器發(fā)送
conn.Write(str[:n])
}
}()
//接收服務(wù)器回復(fù)的數(shù)據(jù)
//切片緩沖
buf := make([]byte, 1024)
for {
n, err := conn.Read(buf) //接收服務(wù)器的請(qǐng)求
if err != nil {
fmt.Println("conn.Read err = ", err)
return
}
fmt.Println(string(buf[:n])) //打印接收到的內(nèi)容, 轉(zhuǎn)換為字符串再打印
}
}
以上就是go語(yǔ)言中的udp協(xié)議及TCP通訊實(shí)現(xiàn)示例的詳細(xì)內(nèi)容,更多關(guān)于go語(yǔ)言u(píng)dp協(xié)議TCP通訊的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Go實(shí)現(xiàn)分布式唯一ID的生成之雪花算法
本文主要介紹了Go實(shí)現(xiàn)分布式唯一ID的生成之雪花算法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05
在Visual Studio Code中配置GO開(kāi)發(fā)環(huán)境的詳細(xì)教程
這篇文章主要介紹了在Visual Studio Code中配置GO開(kāi)發(fā)環(huán)境的詳細(xì)教程,需要的朋友可以參考下2017-02-02
使用Go實(shí)現(xiàn)TLS服務(wù)器和客戶端的示例
本文主要介紹了Go實(shí)現(xiàn)TLS服務(wù)器和客戶端的示例,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12
gin框架Context如何獲取Get?Query?Param函數(shù)數(shù)據(jù)
這篇文章主要為大家介紹了gin框架Context?Get?Query?Param函數(shù)獲取數(shù)據(jù),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03
淺析Go語(yǔ)言中數(shù)組的這些細(xì)節(jié)
這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言中數(shù)組一些細(xì)節(jié)的相關(guān)資料,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Go語(yǔ)言有一定的幫助,需要的可以了解一下2022-11-11

