網路通訊4:TCP廣播
服務端實現
import (
"fmt"
"net"
"os"
"strings"
)
//儲存客戶端連線, key,ip埠,value 連結物件
var onlineConnsMap = make(map[string]net.Conn)
//訊息佇列,緩衝區
var messageQueue = make(chan string, 1000)
//訊息,處理程式退出
var quitchan = make(chan bool)
func CheckErrorS(err error) {
if err != nil {
fmt.Println("網路錯誤", err.Error())
os.Exit(1)
}
}
func Processinfo(conn net.Conn) {
buf := make([]byte, 1024) //開創緩衝區
defer func() {
//關閉連線
conn.Close()
fmt.Println("連線已關閉:",conn.RemoteAddr())
}()
for {
n, err := conn.Read(buf) //讀取資料
if err != nil {
fmt.Println("讀取客戶端訊息出錯,err=",err)
break
}
if n != 0 {
//訊息處理,
message := string(buf[0:n])
fmt.Printf("受到客戶端%v訊息:%s\n",conn.RemoteAddr(),message)
//訊息佇列儲存訊息
messageQueue <- message
fmt.Println("該條訊息已加入佇列...")
}else{
fmt.Println("讀取客戶端訊息長度為0")
}
}
}
//訊息的協程
func consumeMessage() {
for {
select {
case message := <-messageQueue: //取出訊息
fmt.Println("已從佇列中取出訊息")
strs := strings.Split(message, "#") //字串切割
if len(strs) > 1 {
//127.0.0.1:12345#去死
//擷取地址並裁減頭尾空白
addr := strs[0]
addr = strings.TrimSpace(addr)
//擷取內容
msg := strs[1]
//給所有客戶端群發此訊息
/*for addr, conn := range onlineConnsMap { //迴圈線上列表
_, err := conn.Write([]byte(msg))
fmt.Println("伺服器傳送訊息", msg, "給", addr)
if err != nil {
fmt.Println("線上連結傳送失敗")
}
}*/
//@某人,發訊息
if conn, ok := onlineConnsMap[addr]; ok {
_, err := conn.Write([]byte(msg))
fmt.Println("伺服器傳送訊息", msg)
if err != nil {
fmt.Println("線上連結傳送失敗")
}
}
}
case <-quitchan: //處理退出
os.Exit(0)
}
}
}
func main() {
//建立TCP伺服器
listener, err := net.Listen("tcp", "127.0.0.1:8898")
CheckErrorS(err)
defer listener.Close() //關閉網路
fmt.Println("伺服器正在等待")
go consumeMessage()
for {
conn, err := listener.Accept() //新的客戶端連線
CheckErrorS(err)
//處理每一個客戶端
addr := fmt.Sprint(conn.RemoteAddr()) //取出地址
onlineConnsMap[addr] = conn
fmt.Println("客戶端列表")
fmt.Println("-------------------")
for key := range onlineConnsMap { //迴圈每一個連結
fmt.Println(key)
}
go Processinfo(conn)
}
}
客戶端呢實現
import (
"fmt"
"net"
"bufio"
"os"
)
func CheckErrorC(err error) {
if err != nil {
fmt.Println("網路錯誤", err.Error())
}
}
func MessageSend(conn net.Conn) {
var input string
for {
reader := bufio.NewReader(os.Stdin) //讀取鍵盤輸入
data, _, _ := reader.ReadLine() //讀取一行
input = string(data) //鍵盤輸入轉化為字串
if input == "exit" {
conn.Close()
fmt.Println("客戶端關閉")
break
}
_, err := conn.Write([]byte(input)) //輸入寫入字串
fmt.Println("傳送訊息", input)
if err != nil {
conn.Close()
fmt.Println("客戶端關閉")
break
}
}
}
func main() {
conn, err := net.Dial("tcp", "127.0.0.1:8898") //建立TCP伺服器
defer conn.Close() //延遲關閉網路連線
CheckErrorC(err) //檢查錯誤
go MessageSend(conn) //開啟一個協程,處理髮送
//conn.Write([]byte("hello nimei"))
//協程,負責收取訊息
buf := make([]byte, 1024)
for {
numOfBytes, err := conn.Read(buf)
CheckErrorC(err)
fmt.Println("收到伺服器訊息", string(buf[:numOfBytes]))
}
fmt.Println("客戶端關閉")
}
學院Go語言視訊主頁
https://edu.csdn.net/lecturer/1928
[清華團隊帶你實戰區塊鏈開發]
(https://ke.qq.com/course/344443?tuin=3d17195d)
掃碼獲取海量視訊及原始碼 QQ群:721929980
相關文章
- 網路通訊3:TCP互動通訊TCP
- 網路通訊2:TCP簡單通訊TCP
- 網路通訊2:TCP通訊實現TCP
- NModbus4 TCP通訊TCP
- 網路通訊協議-TCP協議詳解!協議TCP
- 系列TCP/IP協議-廣播與多播(010)TCP協議
- TCP通訊TCP
- 廣播訊息
- 網路通訊
- 通過故事引申網路協議TCP協議TCP
- modbus tcp通訊TCP
- Python 基於 TCP 傳輸協議的網路通訊實現PythonTCP協議
- 校園IP網路廣播系統方案
- 小區廣播背景音樂IP網路廣播系統方案設計概要
- udp網路通訊UDP
- 一文搞懂如何使用Node.js進行TCP網路通訊Node.jsTCP
- Java進階:基於TCP通訊的網路實時聊天室JavaTCP
- 【3分鐘速覽】前端廣播式通訊:Broadcast Channel前端AST
- Linux TCP通訊示例LinuxTCP
- 旅遊景區IP網路廣播系統方案-旅遊風景區景點IP網路廣播建設指南
- Android與物聯網裝置通訊-利用UDP廣播來做裝置查詢AndroidUDP
- 用張量廣播機制實現神經網路反向傳播神經網路反向傳播
- 19作 網路通訊
- dubbo網路通訊(四)
- 網路通訊1:UDPUDP
- 網路通訊基礎
- 網路通訊協議協議
- lora模組是怎麼提過廣播傳輸通訊?
- Java:基於TCP協議網路socket程式設計(實現C/S通訊)JavaTCP協議程式設計
- java多執行緒實現TCP網路Socket程式設計(C/S通訊)Java執行緒TCP程式設計
- QT從入門到入土(九)——TCP/IP網路通訊(以及檔案傳輸)QTTCP
- 網路通訊4:HTTP實現二進位制傳輸HTTP
- 網路通訊程式設計程式設計
- docker系列(五):網路通訊Docker
- 廣東資訊通訊業:2018年5月廣東省網際網路及相關行業發展情況行業
- 殭屍網路 Emotet 能通過相鄰 Wi-Fi 網路傳播
- 《Linux網路開發必學教程》12_TCP通訊框架:服務端設計LinuxTCP框架服務端
- Java實現TCP通訊程式JavaTCP