編輯:Android開發教程
Socket 編程基礎知識:
主要分服務器端編程和客戶端編程。
服務器端編程步驟:
1: 創建服務器端套接字並綁定到一個端口上(0-1023是系統預留的,最好大約1024)
2 : 套接字設置監聽模式等待連接請求
3: 接受連接請求後進行通信
4: 返回,等待贏 一個連接請求
客戶端編程步驟:
1: 創建客戶端套接字(指定服務器端IP地址與端口號 )
2: 連接(Android 創建Socket時會自動連接)
3: 與服務器端進行通信
4: 關閉套接字
Android Socket 通信原理注意:
1: 中間的管道連接是通過 InputStream/OutputStream流實現的。
2: 一旦管道建立起來可進行通信
3: 關閉管道 的同時意味著關閉Socket
4: 當對同一個Socket創建重復管道時會異常
5: 通信過程中 順序很重要:服務器端首先得到輸入流,然後將輸入流信息輸出到其各個客戶端
客戶端先建立連 接後先寫入輸出流,然後再獲得輸入流。不然活有EOFException的異常。
不要忘記添加Internet權限 ,不要忘記添加Internet權限,不要忘記添加Internet權限
服務器端代碼的編寫:
import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; public class Server { static ServerSocket aServerSocket = null; // Server Socet. DataInputStream aDataInput = null; // Server input Stream that to // receive msg from client. DataOutputStream aDataOutput = null; // Server output Stream that to static ArrayList list = new ArrayList(); public static void main(String[] args) { try { aServerSocket = new ServerSocket(50003); // listen 8888 port. System.out.println("already listen 50003 port."); } catch (Exception e) { e.printStackTrace(); } int num = 0; while (num < 10) { Socket aSessionSoket = null; try { aSessionSoket = aServerSocket.accept(); MyThread thread = new Server().new MyThread(aSessionSoket); thread.start(); num = list.size(); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } } class MyThread extends Thread { Socket aSessionSoket = null; public MyThread(Socket socket) { aSessionSoket = socket; } public void run() { try { aDataInput = new DataInputStream(aSessionSoket.getInputStream()); aDataOutput = new DataOutputStream(aSessionSoket.getOutputStream()); list.add(aDataOutput); while (true) { String msg = aDataInput.readUTF(); // read msg. if (!msg.equals("connect...")) { System.out.println("ip: "+ aSessionSoket.getInetAddress());// ip.System.out.println("receive msg: " + msg); for (int i = 0; i < list.size(); i++) { DataOutputStream output = (DataOutputStream) list.get(i); output.writeUTF(msg + "----" + list.size()); } if (msg.equals("end")) break; } aDataOutput.writeUTF(""); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { try { aDataInput.close(); if (aDataOutput != null) aDataOutput.close(); list.remove(aDataOutput); aSessionSoket.close(); } catch (Exception e2) {
一、使用ContentProvider(內容提供者)共享數據ContentProvider在android中的作用是對外共 享數據,也就是說你可以通過ContentPro
ListView是一個可以被深度擴展的視圖。在做項目的時候,擴展ListView去顯示數據是必不可免的。接下 來會展示如何在ListView中去選擇多個物件,以及如何使用
當用戶與視圖views進行交互的時候,views也會觸發事件。舉個例子,當用戶點擊了一個按鈕,你需要為 這個事件服務,只有這樣,才能去執行某些適當的行為。如果想這麼做的話
本系列文章都會以一個程序的實例開發為主線來進行講解,以求達到一個循序漸進的學習效果,這樣更能 加深大家對於程序為什麼要這樣寫的用意,理論加上實際的應用才能達到事半功倍的