1. 程式人生 > >Netty框架的學習經歷開始篇--一點工作經歷

Netty框架的學習經歷開始篇--一點工作經歷

之前遇到一客戶需要做硬體聯網,類似於售賣機的東西,於是有了用socket來搞的想法,結果真的可行。

以下的想法我想可以遷移到大多數類似的專案中。

該專案需求:客戶需要讓他的售賣機能夠互聯,由統一後臺管理,而且在售賣機買東西的客人直接掃描機器上的二維碼就可以轉到商城,在商城中選擇商品,比如熱飲,那麼售賣機就會自動製作熱飲,客戶用微信或支付寶支付即可,不需要再由人工在售賣機旁邊守候,且如果售賣機有故障,或者缺水之類的,可直接傳送簡訊給最近的維護人員進行處理。

解決方法:商城:在二維碼中包含裝置資訊,以區分哪臺裝置。使用者通過支付寶或微信支付時連線中包含商品資訊,在發起支付時儲存裝置和商品資訊,得到支付成功資訊後回寫支付成功標誌。

如何告知售賣機應該出那種產品?

商城中建立一個socket服務端,售賣機上由一個可聯網的硬體裝置充當socket客戶端,主要是用來透傳裝置資料。

首先,售賣機發送一個裝置id或者說socket的id到服務端,服務端記錄該id並與事先編制好的編號匹配,並記錄該socket的資訊,如登入時間

其次,售賣機會每隔3分鐘傳送一次心跳(間隔時間可調),以維持連線以免服務端下發資訊時連線不上客戶端。

然後,售賣機會發送當前狀態到服務端,服務端接受到後就會進行判斷處理,無論是否正常都會發送一個已收到的標識碼到客戶端,告訴客戶端我知道了,那麼客戶端就停止傳送狀態

那麼,如果售賣機時空閒正常的,那麼服務端就檢查資料庫中的訂單表是否有訂單,如果有,服務端推送訊息告訴客戶端要出售什麼東西,如果沒有,服務端靜默等待訂單。當有訂單時,且售賣機空閒那麼傳送訂單資訊到售賣機。當售賣機由忙碌轉為空閒狀態時,服務端就去檢查訂單表,以此迴圈。如果服務端發生重啟,那麼向售賣機發送重置狀態指令,使其重新發送當前狀態。

問題:

該socket通訊使用的時java自帶的socket,屬於bio通訊模式,也就是說阻塞式的,問題多多。

1、等待客戶端連線accept()就需要一個執行緒去維護,不然就會導致執行緒堵塞,整個程式都要等待,所以需要專門一個執行緒來處理accept。

2、每次有客戶端連線過來就要new一個執行緒出來,用來專門處理該客戶端的io。

3、因為各個售賣機時同樣的處理模式,也就是客戶端的執行緒裡的處理程式是一樣的,所以不需要多個不同的例項來面向不同的裝置,每次new執行緒時,new一個相同的例項出來就行了,但問題在於,所有的例項都是一樣的內容,那麼io如何區分呢,那就要map去繫結socket與io的關係,通過socket第一次傳送的id來區分不同的socket,雖然程式本身也沒有將不同的socket混在一塊但是你要知道當所有的裝置socket客戶端都連線到了伺服器時,當有訂單觸發時到底傳送給那個裝置,而該裝置的io流是哪個。

4、商城是二次開發的一個php商城,最為頭疼的地方其實在這,於是用php寫了個socket客戶端,當有訂單時通過socket客戶端與server通訊,告知server有訂單,讓server去服務端查詢。一開始也想用php寫一個serversocket,但是技術有限,而且php是解釋性語言,邊解釋邊執行,沒有很好的簡便的方法做到讓其一直在後臺靜默執行,php是事件驅動的無法自發執行。

目前java serversocket已經執行半年多了,但是問題多多,首先,當裝置增加到50臺的時候就行了伺服器擴容升級,執行緒太多,對於java來說執行緒就是他的生命。稀缺資源。而且日誌輸出上,需要定期處理,而且有時會卡硬碟,那麼有什麼辦法解決呢?

最後選定了兩個框架,netty與mina。

不再論述它倆的區別。通過一陣的研究,感覺netty要比mina配置起來簡單,而且穩定性要好,但是效率要比mina低。

所以從netty入手開始搞起,如果有時間再研究mina

得休息了,明天繼續

愛程式設計,愛學習,愛挑戰。

程式猿就是我,我就是程式猿。