標籤:android 網路編程 socket 聊天室 斷點上傳
小豬的Android入門之路 Day 8 part 6
Android網路編程淺析——Socket網路編程初涉
——轉載請註明出處:coder-pig
本節引言
終於迎來了Android網路編程的最後一節:Android中的Socket編程,在這一節中我們
首先需要對TCP/IP協議的概念,以及Socket的相關知識進行介紹,接著介紹下Socket的簡單
流程,最後使用Socket建立簡單的Android聊天室以及Socket實現大檔案的斷點上傳
好了,開始本節內容!
本節學習路線圖:
本文:
TCP/IP和Socket的簡單瞭解:
Socket通訊的基本流程:
簡單的Socket網路聊天室執行個體:
相信學過Java的朋友在Java網路那裡就已經學過使用socket搭建簡單的聊天室了;
我們首先需要建立一個作為服務端的Java app,和Java的是一樣的;
接著我們需要建立一個Android app用於發送與顯示聊天資訊,這裡可別忘了以下兩點:
①Android 4.0後是不允許在主線程中進行網路操作的,所以需要另外開闢一條線程
②為了保證Android安全執行緒,對於介面的修改,只能在主線程中進行;或者通過handler,在
子線程中調用handler發送資訊的方法,調用handler完成介面組件的修改
為了照顧一些對Java不熟的朋友,先寫個簡單的socket連服務端的程式,給大家熟悉熟悉
運行效果如下:
代碼如下:
Java服務端:
Server.java
package com.jay.pc.demo;import java.io.BufferedWriter;import java.io.IOException;import java.io.OutputStreamWriter;import java.net.ServerSocket;import java.net.Socket;public class Server {//定義連接埠號碼private static final int PORT = 9999;public static void main(String[] args) {try{ServerSocket server = new ServerSocket(PORT);//這裡堵塞,無限迴圈,調用accept方法,等待用戶端串連while(true){Socket socket = server.accept();//擷取輸出資料流BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));//寫字串,出現中文要進行轉碼哦,不然會出現亂碼的情況writer.write(new String("串連伺服器成功那麼這個時候問題來了?".getBytes("UTF-8"),"GBK"));writer.flush();writer.close();}}catch(IOException e){e.printStackTrace();}}}
Android用戶端:
activty_main.xml布局檔案:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/LinearLayout1" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.jay.example.socketdemo1.MainActivity" > <Button android:id="@+id/btnlogin" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="串連伺服器" /> <TextView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/txtshow" /> </LinearLayout>
MainActivty.java
package com.jay.example.socketdemo1;import java.io.BufferedReader;import java.io.InputStreamReader;import java.net.Socket;import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.TextView;public class MainActivity extends Activity {private Button btnlogin;private TextView txtshow;private String send;//定義ip地址與連接埠號碼常量private static final String HOST = "192.168.27.172";private static final int PORT = 9999; // 定義Handler對象 private Handler handler = new Handler() { @Override // 當有訊息發送出來的時候就執行Handler的這個方法 public void handleMessage(Message msg) { super.handleMessage(msg); // 處理UI txtshow.setText(send); } }; @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);btnlogin = (Button) findViewById(R.id.btnlogin);txtshow = (TextView) findViewById(R.id.txtshow);btnlogin.setOnClickListener(new AcceptListener());}class AcceptListener implements View.OnClickListener{@Overridepublic void onClick(View v) {new Thread(){public void run() {try{Socket socket = new Socket(HOST,PORT);BufferedReader br = new BufferedReader( new InputStreamReader(socket.getInputStream()));send = br.readLine();br.close();}catch(Exception e){e.printStackTrace();}handler.sendEmptyMessage(0);};}.start();}}}
好了,估計大家看完上面這個代碼以後,對socket聊天室的大概原理流程都有了初步的瞭解了吧,
那麼我們就繼續開發一個可以多個使用者同時聊天的簡單聊天室吧!如下:
接著開啟兩個用戶端,進行聊天,運行用戶端後,控制台可以查看到當前線上的有兩個使用者,以及他們的ip
接著我們開啟兩個模擬器,進行聊天,我們可以看到兩個模擬器都是即時聊天的,發送後即時顯示!
最後,當我們輸如bye的時候,用戶端會斷開與服務端的串連,在另一用戶端中也可以看到,某某退出的資訊!
同樣的,在服務端的Console控制台上也可以看到聊天記錄:
看完,是不是有點心動了,好的,接下來我們就要用代碼去實現了
服務端:server.java
安卓端(用戶端)
*Android使用Socket實現大檔案的斷點續傳
前面我們已經學過使用Http協議來完成檔案的上傳,但是這樣上傳有一個弊病就是,對於大檔案來說
顯得有點坑爹,萬一傳到一半哐當,手機沒電關機了,那麼就下次又必須重新上傳了,這樣顯然是會引起
使用者不滿的(使用者是很急躁的),於是乎我們要使用socket來完成大檔案的上傳操作,並且加入斷點功能
和前面的多線程斷點下載有點類似,筆者水平有限,而且鑒於時間關係,也不自己敲出整個程式來了;
這裡直接用傳智播客老師——黎明活老師提供的代碼了,為了方便大家掌握使用,也會解析下程式!
好了,那麼先看下效果先!
先把要上傳的檔案拖拉到sd卡目錄下,接著先開啟服務端,然後再運行用戶端,點擊上傳!
上傳完成後,來到server的工程路徑下,可以看到在file路徑下可以找到我們上傳的檔案以及一個記錄檔
當然,你也可以下到一半然後退出模擬器,再次上傳檔案,驗證斷點上傳的功能是否有效!
好了,下面就讓我們來解析下實現的代碼!
先說下服務端吧!
小豬的Android入門之路 Day 8 part 6