小豬的Android入門之路 Day 8 part 6

來源:互聯網
上載者:User

標籤: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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.