標籤:dial 介面 UNC 位元組流 轉換 發送資訊 src 程式 package
一、目的
使用Go語言實現一個伺服器端與用戶端的聊天室。
軟體:Goland,Go1.9
二、思路
1,首先啟動伺服器端,使用listen_socket函數監聽IP地址上的用戶端串連;
2,啟動用戶端,並向伺服器端發送資料,發送結束後連接埠阻塞,等待伺服器端的訊息;
3,伺服器端接收到由用戶端發送來的訊息;
4,伺服器端向用戶端發送資料,發送結束後;
5,用戶端接收到由伺服器端發送來的訊息,發送結束後連接埠阻塞,等待用戶端的訊息;
6,重複步驟2-5;
7,如果伺服器端接收到由用戶端發送來的“close"訊息後,伺服器端關閉與用戶端的串連,繼續等待下一個用戶端的串連;
8,用戶端關閉,聊天結束。
三、Go代碼實現
Sever端
// One-to-one ChatRoom Severpackage mainimport ( "fmt" "net")//var ConnMap map[string]*net.TCPConnfunc main() { listen_socket, err := net.Listen("tcp", "127.0.0.1:8000") //開啟監聽介面 if err != nil { //如果有錯誤 fmt.Println("sever error") } defer listen_socket.Close() //延遲伺服器端關閉 fmt.Println("sever is wating ....") for { conn, err := listen_socket.Accept() //監聽用戶端的連接埠 if err != nil { fmt.Println("conn fail ...") } fmt.Println("connect client successed") //顯示伺服器端串連成功 var msg string //聲明msg為字串變數 for { //開始接收用戶端發過來的訊息 msg = "" //字串msg初始為空白 data := make([]byte, 255) //建立並聲明資料變數,為255位 msg_read, err := conn.Read(data) //接收由用戶端發來的訊息,位元組賦值給msg_read,err為錯誤 if msg_read == 0 || err != nil { //如果讀取的訊息為0位元組或者有錯誤 fmt.Println("err") } msg_read_str := string(data[0:msg_read]) //將msg_read_str的位元組格式轉化成字串形式 if msg_read_str == "close" { //如果接收到的用戶端訊息為close conn.Write([]byte("close")) break } //fmt.Println(string(data[0:msg_read])) fmt.Println("client say: ", msg_read_str) //接收用戶端發來的資訊 fmt.Printf("say to client: ") //提示向用戶端要說的話 fmt.Scan(&msg) //輸入伺服器端要對用戶端說的話 //conn.Write([]byte("hello client\n")) //msg_write := []byte(msg) conn.Write([]byte(msg)) //把訊息發送給用戶端 //此處造成伺服器端的連接埠堵塞 } fmt.Println("client Close\n") conn.Close() //關閉串連 }}
Client端
// One-to-one ChatRoom Clientpackage mainimport ( "fmt" "net")func main() { conn, err := net.Dial("tcp", "127.0.0.1:8000") if err != nil { fmt.Println("conn fail...") } defer conn.Close() fmt.Println("connect sever successed") var msg string //聲明msg為字串變數 for { msg = "" //初始化msg為空白值 fmt.Printf("say to sever: ") fmt.Scan(&msg) //輸入用戶端向伺服器端要發送的訊息 //fmt.Println(msg) //msg_write := []byte(msg) //conn.Write(msg_write) conn.Write([]byte(msg)) //資訊轉化成位元組流形式並向伺服器端發送 //此處造成用戶端程式連接埠堵塞 //fmt.Println([]byte(msg)) //等待伺服器端發送資訊回來 data := make([]byte, 255) msg_read, err := conn.Read(data) if msg_read == 0 || err != nil { fmt.Println("err") } msg_read_str := string(data[0:msg_read]) if msg_read_str == "close" { conn.Write([]byte("close")) break } fmt.Println("sever say:", msg_read_str) } conn.Close()}
四、小結
- Write、Read、conn、Scan函數可造成程式的堵塞;
- 網路中一般是用位元組進行資料的傳輸,所以需要進行格式轉換:發送時由字串轉位元組;接收時由位元組轉字串。
Go語言實踐_實現點對點聊天室