上一節(jié)中,我們?yōu)槊總€(gè)連接都創(chuàng)建了一個(gè)goroutine來讀取其中的消息,現(xiàn)在我們將這個(gè)讀取消息的方法實(shí)現(xiàn)一下。
創(chuàng)新互聯(lián)公司專業(yè)成都網(wǎng)站制作、成都網(wǎng)站建設(shè)、外貿(mào)營(yíng)銷網(wǎng)站建設(shè),集網(wǎng)站策劃、網(wǎng)站設(shè)計(jì)、網(wǎng)站制作于一體,網(wǎng)站seo、網(wǎng)站優(yōu)化、網(wǎng)站營(yíng)銷、軟文發(fā)布平臺(tái)等專業(yè)人才根據(jù)搜索規(guī)律編程設(shè)計(jì),讓網(wǎng)站在運(yùn)行后,在搜索中有好的表現(xiàn),專業(yè)設(shè)計(jì)制作為您帶來效益的網(wǎng)站!讓網(wǎng)站建設(shè)為您創(chuàng)造效益。
我們?cè)赼pplication目錄下新建controllers目錄,并在其中創(chuàng)建一個(gè)MessageController.go文件。
首先我們新建一個(gè)MessageController的結(jié)構(gòu)體,內(nèi)容如下
這個(gè)結(jié)構(gòu)體包括兩個(gè)內(nèi)容,一個(gè)是我們將連接放在數(shù)組之后,返回的索引,另一個(gè)是連接本身.
這個(gè)是具體的方法。
我們首先設(shè)置了一下讀消息的大小、超時(shí)時(shí)間以及超時(shí)后需要的操作。
超時(shí)時(shí)間如果設(shè)置為0,那么就是永不超時(shí)。之前在這里直接寫0,被告知需要傳一個(gè)time.Time類型的數(shù)據(jù)。最終谷歌后才得到了這個(gè)值time.Time{}為"0001-01-01 00:00:00 +0000 UTC"。
我們將用戶手法消息的內(nèi)容定義為一個(gè)結(jié)構(gòu)體,然后將用戶的訂閱信息的json通過json.unmarshal轉(zhuǎn)換成這個(gè)結(jié)構(gòu)體。
之后的switch操作與我們?cè)赟woole中的操作基本雷同,在查詢到login之后,調(diào)用service中 的login方法來進(jìn)行注冊(cè)。
下一節(jié)中我們?cè)俳榻B具體的注冊(cè)邏輯。
我們?cè)趍ian函數(shù)中,首先初始化配置文件,然后新建http連接。
這個(gè)連接創(chuàng)建之后,監(jiān)聽服務(wù)器的9999端口。如果url的路徑后綴為 "/ws",就轉(zhuǎn)發(fā)到ws/ws.go中的IndexHandler方法中。
這個(gè)方法中首先我們創(chuàng)建一個(gè)websocket的Upgrader實(shí)例,然后我們使用Upgrader的upgrade方法來升級(jí)一下我們的連接為長(zhǎng)連接。
升級(jí)完成之后會(huì)返回一個(gè)*websocket.Conn的連接,我們之后所有的關(guān)于連接的操作,都是基于該conn的。
在該連接完成之后,我們將連接存放到一個(gè)名為Client的map中,以便之后管理更為方便。
之后,我們啟動(dòng)一個(gè)goroutine來讀取連接中發(fā)送的信息內(nèi)容,再根據(jù)內(nèi)容進(jìn)行相應(yīng)的操作。
Go的三種安裝方式
Go有多種安裝方式,你可以選擇自己喜歡的。這里我們介紹三種最常見的安裝方式:
Go源碼安裝:這是一種標(biāo)準(zhǔn)的軟件安裝方式。對(duì)于經(jīng)常使用Unix類系統(tǒng)的用戶,尤其對(duì)于開發(fā)者來說,從源碼安裝可以自己定制。
Go標(biāo)準(zhǔn)包安裝:Go提供了方便的安裝包,支持Windows、Linux、Mac等系統(tǒng)。這種方式適合快速安裝,可根據(jù)自己的系統(tǒng)位數(shù)下載好相應(yīng)的安裝包,一路next就可以輕松安裝了。**推薦這種方式**
第三方工具安裝:目前有很多方便的第三方軟件包工具,例如Ubuntu的apt-get、Mac的homebrew等。這種安裝方式適合那些熟悉相應(yīng)系統(tǒng)的用戶。
最后,如果你想在同一個(gè)系統(tǒng)中安裝多個(gè)版本的Go,你可以參考第三方工具GVM,這是目前在這方面做得最好的工具,除非你知道怎么處理。
Go源碼安裝
在Go的源代碼中,有些部分是用Plan 9 C和ATT匯編寫的,因此假如你要想從源碼安裝,就必須安裝C的編譯工具。
在Mac系統(tǒng)中,只要你安裝了Xcode,就已經(jīng)包含了相應(yīng)的編譯工具。
在類Unix系統(tǒng)中,需要安裝gcc等工具。例如Ubuntu系統(tǒng)可通過在終端中執(zhí)行sudo apt-get install gcc
libc6-dev來安裝編譯工具。
在Windows系統(tǒng)中,你需要安裝MinGW,然后通過MinGW安裝gcc,并設(shè)置相應(yīng)的環(huán)境變量。
你可以直接去官網(wǎng)下載源碼,找相應(yīng)的goVERSION.src.tar.gz的文件下載,下載之后解壓縮到$HOME目錄,執(zhí)行如下代碼:
cd go/src
./all.bash
運(yùn)行all.bash后出現(xiàn)"ALL TESTS PASSED"字樣時(shí)才算安裝成功。
上面是Unix風(fēng)格的命令,Windows下的安裝方式類似,只不過是運(yùn)行all.bat,調(diào)用的編譯器是MinGW的gcc。
如果是Mac或者Unix用戶需要設(shè)置幾個(gè)環(huán)境變量,如果想重啟之后也能生效的話把下面的命令寫到.bashrc或者.zshrc里面,
export GOPATH=$HOME/gopath
export PATH=$PATH:$HOME/go/bin:$GOPATH/bin
如果你是寫入文件的,記得執(zhí)行bash .bashrc或者bash
.zshrc使得設(shè)置立馬生效。
如果是window系統(tǒng),就需要設(shè)置環(huán)境變量,在path里面增加相應(yīng)的go所在的目錄,設(shè)置gopath變量。
當(dāng)你設(shè)置完畢之后在命令行里面輸入go,看到如下圖片即說明你已經(jīng)安裝成功
圖1.1 源碼安裝之后執(zhí)行Go命令的圖
如果出現(xiàn)Go的Usage信息,那么說明Go已經(jīng)安裝成功了;如果出現(xiàn)該命令不存在,那么可以檢查一下自己的PATH環(huán)境變中是否包含了Go的安裝目錄。
關(guān)于上面的GOPATH將在下面小節(jié)詳細(xì)講解
Go標(biāo)準(zhǔn)包安裝
Go提供了每個(gè)平臺(tái)打好包的一鍵安裝,這些包默認(rèn)會(huì)安裝到如下目錄:/usr/local/go
(Windows系統(tǒng):c:\Go),當(dāng)然你可以改變他們的安裝位置,但是改變之后你必須在你的環(huán)境變量中設(shè)置如下信息:
export GOROOT=$HOME/go
export GOPATH=$HOME/gopath
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
上面這些命令對(duì)于Mac和Unix用戶來說最好是寫入.bashrc或者.zshrc文件,對(duì)于windows用戶來說當(dāng)然是寫入環(huán)境變量。
我們可以看到 gorilla/websocket中的examples中有一個(gè)聊天室的demo。
我們進(jìn)入該項(xiàng)目可以看到里面有這樣的一些內(nèi)容
按照官方的運(yùn)行方式來運(yùn)行這個(gè)項(xiàng)目
在瀏覽器中打開8080端口,可以看到該項(xiàng)目可以被成功運(yùn)行了。
就是這樣一個(gè)簡(jiǎn)單的demo。
然后我們?nèi)タ匆幌滤木唧w實(shí)現(xiàn)。
在這個(gè)項(xiàng)目中首先定義了一個(gè)hub的結(jié)構(gòu)體:
這個(gè)結(jié)構(gòu)體中,clients代表所有已經(jīng)注冊(cè)的用戶,broadcast管道會(huì)存儲(chǔ)客戶端發(fā)送來的信息。 register是一個(gè)*Client類型的管道,用于存儲(chǔ)新注冊(cè)的用戶,unregister管道反之。
我們打開main.go,main函數(shù)的源碼為:
在這里首先會(huì)新開一個(gè)goroutine,去跑hub的run方法,run方法中一個(gè)死循環(huán),不停地去輪詢hub中的內(nèi)容
如果取到了新用戶,就加入到clients中,如果取到了信息,就循環(huán)所有的client,將信息寫到client.send中。
我們看到在請(qǐng)求路徑為根的時(shí)候,它會(huì)請(qǐng)求一個(gè)函數(shù),而這個(gè)函數(shù)就是將home.html發(fā)送到客戶端。
而在請(qǐng)求路徑為“/ws”的時(shí)候,他會(huì)執(zhí)行一個(gè)serveWS的函數(shù)。
每當(dāng)一個(gè)新的用戶進(jìn)來之后,首先將連接升級(jí)為長(zhǎng)連接,然后將當(dāng)前的client寫到register中,由hub.run函數(shù)去做處理。然后開啟兩個(gè)goroutine,一個(gè)去讀client中發(fā)送來的數(shù)據(jù),一個(gè)將數(shù)據(jù)寫入到所有的client中,去發(fā)送給用戶。
這就是整個(gè)聊天室的實(shí)現(xiàn)原理。
本文題目:go語言聊天服務(wù)器搭建 go語言做服務(wù)器
文章轉(zhuǎn)載:http://chinadenli.net/article16/dodsjdg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供動(dòng)態(tài)網(wǎng)站、面包屑導(dǎo)航、服務(wù)器托管、品牌網(wǎng)站建設(shè)、、網(wǎng)站內(nèi)鏈
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)