奇妙的go語言(聊天室的開發)

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。


【 聲明:著作權全部,歡迎轉載,請勿用於商業用途。  聯絡信箱:feixiaoxing @163.com】


    這是一篇關於聊天室開發的部落格,原來文章的地址來自於此。這篇文章非常具有代表性,對於代碼中的函數部分內容,不想多說什麼,僅僅是對它的實現進行一些必要的解說。關於代碼,大家既能夠在這裡閱讀,也能夠跳轉到那篇部落格,繼續閱讀。


package mainimport("fmt""os""net")////////////////////////////////////////////////////////////錯誤檢查//////////////////////////////////////////////////////////func checkError(err error,info string) (res bool) {if(err != nil){fmt.Println(info+"  " + err.Error())return false}return true}////////////////////////////////////////////////////////////server端接收資料線程//參數://資料連線 conn//通訊通道 messages//////////////////////////////////////////////////////////func Handler(conn net.Conn,messages chan string){fmt.Println("connection is connected from ...",conn.RemoteAddr().String())buf := make([]byte,1024)for{lenght, err := conn.Read(buf)if(checkError(err,"Connection")==false){conn.Close()break}if lenght > 0{buf[lenght]=0}//fmt.Println("Rec[",conn.RemoteAddr().String(),"] Say :" ,string(buf[0:lenght]))reciveStr :=string(buf[0:lenght])messages <- reciveStr}}////////////////////////////////////////////////////////////server發送資料的線程////參數//串連字典 conns//資料通道 messages//////////////////////////////////////////////////////////func echoHandler(conns *map[string]net.Conn,messages chan string){for{msg:= <- messagesfmt.Println(msg)for key,value := range *conns {fmt.Println("connection is connected from ...",key)_,err :=value.Write([]byte(msg))if(err != nil){fmt.Println(err.Error())delete(*conns,key)}}}}////////////////////////////////////////////////////////////啟動server//參數//連接埠 port//////////////////////////////////////////////////////////func StartServer(port string){service:=":"+port //strconv.Itoa(port);tcpAddr, err := net.ResolveTCPAddr("tcp4", service)checkError(err,"ResolveTCPAddr")l,err := net.ListenTCP("tcp",tcpAddr)checkError(err,"ListenTCP")conns:=make(map[string]net.Conn)messages := make(chan string,10)//啟動server廣播線程go echoHandler(&conns,messages)for  {fmt.Println("Listening ...")conn,err := l.Accept()checkError(err,"Accept")fmt.Println("Accepting ...")conns[conn.RemoteAddr().String()]=conn//啟動一個新線程go Handler(conn,messages) }}////////////////////////////////////////////////////////////client發送線程//參數//發送串連 conn//////////////////////////////////////////////////////////func chatSend(conn net.Conn){var input stringusername := conn.LocalAddr().String()for {fmt.Scanln(&input)if input == "/quit"{fmt.Println("ByeBye..")conn.Close()os.Exit(0);}lens,err :=conn.Write([]byte(username + " Say :::" + input))fmt.Println(lens)if(err != nil){fmt.Println(err.Error())conn.Close()break}}}////////////////////////////////////////////////////////////client啟動函數//參數//遠程ip地址和連接埠 tcpaddr//////////////////////////////////////////////////////////func StartClient(tcpaddr string){tcpAddr, err := net.ResolveTCPAddr("tcp4", tcpaddr)checkError(err,"ResolveTCPAddr")conn, err := net.DialTCP("tcp", nil, tcpAddr)checkError(err,"DialTCP")//啟動client發送線程go chatSend(conn)//開始client輪訓buf := make([]byte,1024)for{lenght, err := conn.Read(buf)if(checkError(err,"Connection")==false){conn.Close()fmt.Println("Server is dead ...ByeBye")os.Exit(0)}fmt.Println(string(buf[0:lenght]))}}////////////////////////////////////////////////////////////主程式////參數說明://啟動server端:  Chat server [port]eg: Chat server 9090//啟動client:    Chat client [Server Ip Addr]:[Server Port]  eg: Chat client 192.168.0.74:9090//////////////////////////////////////////////////////////func main(){if len(os.Args)!=3  {fmt.Println("Wrong pare")os.Exit(0)}if os.Args[1]=="server" && len(os.Args)==3 {StartServer(os.Args[2])}if os.Args[1]=="client" && len(os.Args)==3 {StartClient(os.Args[2])}}


     主要知識點例如以下:


    (1)代碼中包含了server和client的內容,假設是server,直接輸入./chat server 9090就可以,client也非常easy,輸入./chat client :9090就好;


    (2)假設是client,事實上就包含了兩部分內容,一部分是chatSend函數,接受使用者的輸入;還有一部分是connect到server,接受相關資訊;


    (3)假設是server,略微複雜一點,有三個部分組成。第一部分就是不停地accept各個client;第二個就是為每個client創立Handler函數,接受client發來的資訊;第三個就是echoHandler函數,它的作用就是將從某一使用者接受過來的資訊廣播給其它全部的client,就是這麼簡單。





相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.