前提概要
為藍田等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計制作服務(wù),及藍田網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為網(wǎng)站制作、網(wǎng)站建設(shè)、藍田網(wǎng)站設(shè)計,以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!筆者很久之前其實就已經(jīng)學(xué)習(xí)過了socket,當(dāng)然也是用socket做過了聊天室,但是覺得此知識點比較一般,并無特別難的技術(shù)點,于是也并未深究。
然而近期一個項目中對socket的使用卻讓筆者感覺socket強大無比,可以實現(xiàn)諸多功能。
個人Socket體驗
項目主要有關(guān)智能家居,需要實現(xiàn)多臺手機同時對燈進行操作(開或者關(guān)),主要需要實現(xiàn)以下幾點:
1、進入界面時獲取所有燈的狀態(tài)。
2、一臺手機改變了燈的狀態(tài),其他的手機上可以有所顯示。
3、硬件上改變了燈的狀態(tài)(手動開關(guān)燈),所有手機上要有所顯示。
此功能如果使用HTTP讀取的方式實現(xiàn)就不太合適了。一方面客戶端與服務(wù)器讀取文件的同步性難以保證,即使保證了,也需要浪費大量性能;另一方面,類似筆者的這種項目功能服務(wù)器和客戶端交互比較頻繁,對“即時性”要求也比較高,用HTTP不僅性能消耗太大,而且難以保證“即時性”。
但是使用Socket就很容易實現(xiàn)了,主要邏輯如下:
1、每次進入界面與服務(wù)器建立Socket連接,并得到此時燈的狀態(tài)
2、每次需要對燈進行操作的時候建立一個線程把燈的狀態(tài)傳遞給服務(wù)器,服務(wù)器接收到之后,把該狀態(tài)傳遞給每一個此時與服務(wù)器建立連接的客戶端。
此次體驗也是讓筆者想起了學(xué)長之前做的一道筆試題,題目大概如下:
將淘寶網(wǎng)頁和手機版同時打開賬戶,手機停留在購物車界面,此時網(wǎng)頁上將某一物品加入購物車,如何設(shè)計才能讓手機自動刷新購物車。
如果使用socket,相信是一個不錯的思路。
好了,接下來進入正題,展示socket聊天室demo。
效果(源碼在文章結(jié)尾)
主要思路
Android
1、進入界面客戶端與服務(wù)器建立socket,同時此時開啟一個線程一直接收服務(wù)器發(fā)送來的消息。
2、每次點擊button獲取EditText中的字符串,調(diào)用子線程把字符串發(fā)送給服務(wù)器。
服務(wù)器
1、創(chuàng)建一個ArrayList存儲Socket。
2、循環(huán)接收請求訪問該端口的客戶端,接收到之后,把該socket存儲到ArrayList中,并且為每一個socket開啟一個線程用于通信。
3、每個socket的線程的邏輯如下:循環(huán)接收客戶端發(fā)來的消息,接收到之后,利用之前的ArrayList,發(fā)送到每一個客戶端。如果某個客戶端返回空值或者無法發(fā)送過去,那么表示該客戶端已經(jīng)斷開,就從ArrayList中移除。
代碼
(借鑒《Android瘋狂講義》)
Android
不要忘記在AndroidManifest里面加上訪問網(wǎng)絡(luò)的權(quán)限
MainActivity:
package com.example.double2.sockettesttwo; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; public class MainActivity extends AppCompatActivity { private EditText etMain; private Button btnMain; private TextView tvMain; private ClientThread mClientThread; //在主線程中定義Handler傳入子線程用于更新TextView private Handler mHandler; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); etMain = (EditText) findViewById(R.id.et_main); btnMain = (Button) findViewById(R.id.btn_main); tvMain = (TextView) findViewById(R.id.tv_main); mHandler=new Handler() { @Override public void handleMessage(Message msg) { if (msg.what == 0) { tvMain.append("\n" + msg.obj.toString()); } } }; //點擊button時,獲取EditText中string并且調(diào)用子線程的Handler發(fā)送到服務(wù)器 btnMain.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { try { Message msg = new Message(); msg.what = 1; msg.obj = etMain.getText().toString(); mClientThread.revHandler.sendMessage(msg); etMain.setText(""); } catch (Exception e) { e.printStackTrace(); } } }); mClientThread = new ClientThread(mHandler); new Thread(mClientThread).start(); } }
網(wǎng)頁名稱:androidsocket聊天室功能實現(xiàn)-創(chuàng)新互聯(lián)
文章出自:http://m.rwnh.cn/article26/coipcg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供軟件開發(fā)、網(wǎng)站維護、網(wǎng)站制作、網(wǎng)站收錄、搜索引擎優(yōu)化、企業(yè)網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容