版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、title: Android基礎(chǔ)入門categories: Android7.6.2 基于TCP協(xié)議的Socket通信(1)基礎(chǔ)入門,Android基礎(chǔ)入門 Socket通信(1)7.6.2 基于TCP協(xié)議的本節(jié)引言:1.Socket?2.Socket通信模型:上一節(jié)的概念課枯燥無味是吧,不過總有點收獲是吧,本節(jié)開始來研究基于TCP協(xié)議的Socket通信,先來了解下Socket的概念,以及Socket通信的模型,實現(xiàn)Socket的步驟,以及作為Socket服務(wù)端與客戶端的兩位各做要做什么事情!好的,由淺入深來扣這個Socket吧!Socket通信實現(xiàn)步驟:好的,接下來寫一個簡單的例子,開啟服務(wù)
2、端后,客戶端點擊按鈕然后服務(wù)端,并向服務(wù)端發(fā)送一串字符串,表示通過Socket上服務(wù)器Step 1:創(chuàng)建ServerSocket和SocketStep 2:打開連接到的Socket的輸入/輸出流 Step 3:按照協(xié)議對Socket進(jìn)行讀/寫操作 Step 4:關(guān)閉輸入輸出流,以及Socket3.Socket服務(wù)端的編寫:服務(wù)端要做的事有這些:代碼實現(xiàn):直接在Eclipse下創(chuàng)建一個Java項目,然后把Java代碼貼進(jìn)去即可!public class SocketServer .public sic void main(String args) throwsOException / .創(chuàng)建一個
3、服務(wù)器端Socket,即ServerSocket,指定綁定的端口,并此端口.ServerSocket serverSocket = new ServerSocket( 2345); netAddress address = netAddress.getLocalHost();String ip = address.getHostAddress(); Socket socket = null;/2.調(diào)用accept()等待客戶端連接System.out.prln(服務(wù)端已就緒,等待客戶端接入,服務(wù)端ip地址:ip);.socket = serverSocket.accept();/3.連接后獲取
4、輸入流, nputStream is=null; nputStreamReader isr=null;BufferedReader br=null;OutputStream os=null;客戶端信息.0.2.3.4.PrWritw=null;is = socket.get nputStream();/獲取輸入流isr = new nputStreamReader(is,UT br = new BufferedReader(isr);String info = null;8);while(info=br.readLine()!=null)/循環(huán)客戶端的信息System.out.prln(客戶端
5、發(fā)送過來的信息info);socket.shutdown nput();/關(guān)閉輸入流Step 1:創(chuàng)建ServerSocket對象,綁定的端口Step 2:調(diào)用accept()方法客戶端的請求Step 3:連接建立后,通過輸入流客戶端發(fā)送的請求信息Step 4:通過輸出流向客戶端發(fā)送響應(yīng)信息 Step 5:關(guān)閉相關(guān)資源5.6.7.socket.close();然后把代碼run起來,控制臺會打?。汉玫模酉聛淼紸ndroid客戶端了!4.Socket客戶端的編寫:客戶端要做的事有這些:代碼實現(xiàn):MainActivity.java:public class MainActivity extends
6、ClickListener ptivity implements View.On.Overrideprotected void onCreate(Bundle super.onCreate(saved nstansaved nstane);e) setContentView(R.layout.activity_main);Button btn_accept = (Button) findViewBy d(R.id.btn_accept); btn_accept.setOnClickListener(this);OverrideStep 1:創(chuàng)建Socket對象,指明需要的服務(wù)器的地址和端號St
7、ep 2:建立后,通過輸出流向服務(wù)器發(fā)送請求信息Step 3:通過輸出流獲取服務(wù)器響應(yīng)的信息 Step 4:關(guān)閉相關(guān)資源.0.2.3.4.5.6.7.8.9.0.2.3.4.5.6.7.8.9.public void onClick(View v) newThread() Overridepublic void run() try acceptServer(); catch ( OException e) e.prStackTrace();.start();private void acceptServer() throws OException / .創(chuàng)建客戶端Socket,指定服務(wù)器地址和
8、端口Socket socket = new Socket( 72. 6.2.54, 2345);/2.獲取輸出流,向服務(wù)器端發(fā)送信息OutputStreamos = socket.getOutputStream();/字節(jié)輸出流PrWritw = new PrP地址Writer(os);/將輸出流包裝為打印流/獲取客戶端的netAddress address = netAddress.getLocalHost();String ip = address.getHostAddress();pw.write(客戶端: pw.flush();ip 接入服務(wù)器!);socket.shutdownOut
9、put();/關(guān)閉輸出流 socket.close();因為Android不允許在主線程(UI線另開一個線程來連接Socket!做網(wǎng)絡(luò)操作,所以這里需要自己運(yùn)行結(jié)果:點擊按鈕后,服務(wù)端控制臺打?。?.增強(qiáng)版案例:小豬簡易聊天室只是點擊個按鈕,然后服務(wù)器返回一串信息,肯定是很無趣的是吧,接下來來還需要搭建一個超簡單的聊天室,字節(jié)寫一個線程,具體的需要用到線,Socket的集合,在代碼中來體會!實現(xiàn)的效果圖:先把的服務(wù)端跑起來:接著把的程序分別跑到兩臺模擬器上:接下來來寫代碼:首先是服務(wù)端,就是將讀寫socket的操作放到自定義線程當(dāng)中,創(chuàng)建ServerSocket后,循環(huán)調(diào)用accept方法,當(dāng)
10、有新客戶端接入,將socket加入集合當(dāng)中,同時新建一個線程!另外,在信息的方法中,對輸入字符串進(jìn)行判斷,如果為bye字符串,將socket從集合中移除,然后close掉!Server.java:public class Server /定義相關(guān)的參數(shù),端口,Socket連接的集合,ServerSocket對象/以及線.private sic finalPORT = 2345;privaist mList = new ArrayList(); private ServerSocket server = null;private ExecutorService myExecutorService
11、 = null;public sic void main(String args) new Server();.0.2.3.4.5.6.7.8.9.0.2.3.4.5.6.7.8.9.0.2.3.public Server()tryserver = new ServerSocket(PORT);/創(chuàng)建線myExecutorService = Executors.newCachedThreool();System.out.prln(服務(wù)端運(yùn)行中.n);Socket cnt = null;while(true)cnt = server.accept();mList.add(cnt);myExecu
12、torService.execute(new Service(cnt);catch(Exception e)e.prStackTrace();class Service implements Runnableprivate Socket socket;private BufferedReader in = null; private String msg = ;public Serviocket socket) this.socket = socket; tryin = new BufferedReader(new nputStreamReader(socket.ge t nputStream
13、();4.msg = 用戶: this.socket.get netAddress()加入了聊天室5.6.7.8.9.0.2.3.4.5.6.7.8.9.0.2.3.4.5.當(dāng)前 this.sendmsg();人數(shù): mList.size();catch( OException e)e.prStackTrace();Overridepublic void run() trywhile(true)if(msg = in.readLine() != null)if(msg.equals(bye)System.out.prln();mList.remove(socket);in.close();ms
14、g = 用戶:socket.get netAddress()退出: 當(dāng)前人數(shù): mList.size();6.7.8.9.0.socket.close(); this.sendmsg(); break;elsemsg = socket.get netAddress()說: msg;.2.3.4.5.6.7.8.9.0.2.3.4.5.6.this.sendmsg();catch(Exception e)e.prStackTrace();/為連接上服務(wù)端的每個客戶端發(fā)送信息 public void sendmsg()System.out.prln(msg);num = mList.size();
15、index = 0;index num;index )for(Socket mSocket = mList.get(index);PrWritout = null;7.8.9.try pout = new PrWriter(new BufferedWriter(new OutputStreamWriter(mSocket.getOutputStream(),UT8),true);pout.pr0.2.3.4.5.6.ln(msg);catch ( OException e) e.prStackTrace();接著到客戶端,客戶端的難點在于要另外開辟線程,因為Android不允許直接在主線做網(wǎng)絡(luò)
16、操作,而且不允許在主線的線程操作UI,這里的做法是自己新建一個線程,以及通過Hanlder來更新UI,實際開發(fā)不建議直接這樣做!布局文件:activity_main.xml:MainActivity.java:public class MainActivity extends Runnable ptivity implements./定義相關(guān)變量,完成初始化 private TextView txtshow;private EditText edi private Button btnsend;d;private s private sic final String HOST = 72. 6.
17、2.54;ic finalPORT = 2345;private Socket socket = null; private BufferedReader in = null; private PrWriter out = null; private String content = ; private StringBuilder sb = null;.0.2.3.4.5.6.7.8.9.0.2.3.4.5.6.7./定義一個handler對象,用來刷新界面public Handler handler = new Handler() public void handleMessage(Mess
18、age msg) if (msg.what = 0 x 23) sb.append(content); txtshow.setText(sb.toString();Overrideprotected void onCreate(Bundle saved nstane) super.onCreate(saved nstane);setContentView(R.layout.activity_main); sb = new StringBuilder();txtshow = (TextView) findViewBy d(R.id.txtshow);edid = (EditText) findV
19、iewBy d(R.id.edid);btnsend = (Button) findViewBy d(R.id.btnsend);/當(dāng)程序一開始運(yùn)行的時候就實例化Socket對象,與服務(wù)端進(jìn)行連接,獲取輸入輸出流8.9.0.2.3.4./因為4.0以后不能再主線進(jìn)行網(wǎng)絡(luò)操作,所以需要另外開辟一個線程newThread() public void run() trysocket = new Socket(HOST, PORT); in = new BufferedReader(newnputStreamReader(socket.get nputStream(), UT8);5.out =new PrWriter(new BufferedWriter(newOutputStreamWriter(6.7.8.9.0.2.3.4.5.6.7.8.9.0.2.3.4.5.6.7.8.9.0.2.3.4.5.6.7.8.9.0.socket.getOutputStream(), true); OException e) StackTrace(); catch (e.
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 貴州2025年貴州省衛(wèi)生健康委員會部分直屬事業(yè)單位招聘141人筆試歷年參考題庫附帶答案詳解
- 荊州2025年湖北荊州市市直事業(yè)單位人才引進(jìn)388人筆試歷年參考題庫附帶答案詳解
- 河南河南省實驗幼兒園面向教育部直屬師范大學(xué)2025屆公費(fèi)師范畢業(yè)生招聘筆試歷年參考題庫附帶答案詳解
- 2025年中國固體亞氯酸鈉市場調(diào)查研究報告
- 2025至2031年中國陶瓷型自動鞋套機(jī)行業(yè)投資前景及策略咨詢研究報告
- 2025年脫扣器自動拍打清洗機(jī)項目可行性研究報告
- 2025至2031年中國組合音響揚(yáng)聲器行業(yè)投資前景及策略咨詢研究報告
- 2025年玻璃濾片包裝回收箱項目可行性研究報告
- 2025至2031年中國機(jī)車塑膠配件行業(yè)投資前景及策略咨詢研究報告
- 2025年手機(jī)沙發(fā)項目可行性研究報告
- 駐場保潔方案
- 中國心理衛(wèi)生協(xié)會家庭教育指導(dǎo)師參考試題庫及答案
- 智能廣告投放技術(shù)方案
- 知識產(chǎn)權(quán)保護(hù)執(zhí)法
- 高質(zhì)量社區(qū)建設(shè)的路徑與探索
- 數(shù)字化時代的酒店員工培訓(xùn):技能升級
- 足球守門員撲救技巧:撲救結(jié)合守護(hù)球門安全
- 《學(xué)術(shù)規(guī)范和論文寫作》課件全套 第1-10章 知:認(rèn)識研究與論文寫作 - 引文規(guī)范
- 起重機(jī)更換卷筒施工方案
- 01智慧物流信息技術(shù)概述
- 精神發(fā)育遲滯的護(hù)理查房
評論
0/150
提交評論