神奇的go語言(聊天室的開發),go語言聊天室開發
【 聲明:著作權,歡迎轉載,請勿用於商業用途。 聯絡信箱: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}////////////////////////////////////////////////////////////伺服器端接收資料線程//參數://資料連線 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}}////////////////////////////////////////////////////////////伺服器發送資料的線程////參數//串連字典 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)}}}}////////////////////////////////////////////////////////////啟動伺服器//參數//連接埠 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)//啟動伺服器廣播線程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) }}////////////////////////////////////////////////////////////用戶端發送線程//參數//發送串連 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}}}////////////////////////////////////////////////////////////用戶端啟動函數//參數//遠程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")//啟動用戶端發送線程go chatSend(conn)//開始用戶端輪訓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]))}}////////////////////////////////////////////////////////////主程式////參數說明://啟動伺服器端: Chat server [port]eg: Chat server 9090//啟動用戶端: 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)代碼中包括了伺服器和用戶端的內容,如果是伺服器,直接輸入./chat server 9090即可,用戶端也很簡單,輸入./chat client :9090就好;
(2)如果是用戶端,其實就包括了兩部分內容,一部分是chatSend函數,接受使用者的輸入;另一部分是connect到server,接受相關資訊;
(3)如果是server,稍微複雜一點,有三個部分組成。第一部分就是不停地accept各個用戶端;第二個就是為每一個用戶端創立Handler函數,接受用戶端發來的資訊;第三個就是echoHandler函數,它的作用就是將從某一使用者接受過來的資訊廣播給其他所有的用戶端,就是這麼簡單。
建立一個語音視頻類似聊天室的這系統大概要貴不,是不是會受到網路速度的影響,伺服器的頻寬是不是很重要
1。視頻語音控制項(包括採集,壓縮,傳輸,顯示,錄象,回放,拍照等功能,效果好)
可以很方便的用於即時通,聊天室,視頻會議,遠程教學,視頻監控的二次開發。
2。簡單實用的專業財務管理系統源碼:
根據客戶的要求和多年的經驗,集用友,金碟等多家財務軟體的優點,c/s結構,單機版,
網路版多使用者,sql資料庫,帳套管理流程式操作,簡單,易用,區域網路,互連網都很適用
3。簡單實用的財務進銷存系統源碼:
成熟穩定的財務進銷存軟體,c/s結構,網路版,sql資料庫,帳套管理
流程式操作,簡單,易用,區域網路,異地連鎖店都很適用。
4。知名視頻遊戲源碼及網站源碼
知名視頻遊戲源碼及網站源碼,源碼完整,遊戲種類多
有demo,歡迎試用。
5。即時通源碼
即時通(類似qq,p2p文字語音視訊交談,檔案傳輸,遠程協助)
服務端採用完成連接埠形式,可以整合,級連,可以接受大量的並發人員線上
視頻語音效果好,有不同的版本可供使用者選擇,有demo,歡迎試用。
6。聊天室源碼
類似uc一樣的聊天室,視頻語音效果好,有一個或多個視頻視窗的聊天室有demo,歡迎試用
7。即時通+聊天室源碼
即時通和聊天室整合一體的系統
即時通(類似qq,p2p文字語音視訊交談,檔案傳輸,遠程協助)
聊天室類似uc
有demo,歡迎試用
8。視頻會議源碼
功能強大的視頻會議源碼,包括了視頻會議的常用的功能,視頻語音效果好
有demo,歡迎試用
9。電子白板控制項
可以很方便的做視頻會議,教學等軟體的應用
10. 卡啦ok DIY 源碼
你想自己對住攝相頭,對住mic 自唱自錄自回放,感受自己的聲音嗎,試試這個
怎更改江湖聊天室裡各種功可以的時間限制?
呵呵,我改過的!需要變更檔(asp或者php)原始碼。改過以後能變出很多的玩法!什麼名字我可忘了!