Go語言實踐_實現一(用戶端)對一(伺服器端)聊天室

來源:互聯網
上載者:User

一、目的

使用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函數可造成程式的堵塞;
  • 網路中一般是用位元組進行資料的傳輸,所以需要進行格式轉換:發送時由字串轉位元組;接收時由位元組轉字串。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.