Android 開發即時聊天工具 YQ :(一) Socket 初步
當前位置:點晴教程→知識管理交流
→『 技術文檔交流 』
這段時間在學習Android網絡編程,習慣一邊寫個簡單的項目一邊學習,所以就有了這個簡易的簡易的,,,項目,類似于手機QQ等等的即時聊天工具,當然功能及其簡單,跟那些沒法比,只是學習,實現簡單功能就OK,聽說QQ是有自己的協議的,貌似挺復雜,,,只為學習交流之用,而且本人也是Android小菜鳥一枚,錯誤或不足在所難免,請大家多多指正,3Q~
先看看socket通信基礎: 所謂socket通常也稱作"套接字",用于描述IP地址和端口,是一個通信鏈的句柄。應用程序通常通過"套接字"向網絡發出請求或者應答網絡請求。 Socket和ServerSocket類庫位于java.net包中。ServerSocket用于服務器端,Socket是建立網絡連接時使用的。在連接成功時,應用程序兩端都會產生一個Socket實例,操作這個實例,完成所需的會話。 服務器: 使用ServerSocket監聽指定的端口,等待客戶連接請求,客戶連接后,會話產生;在完成會話后,關閉連接。 使用Socket對網絡上某一個服務器的某一個端口發出連接請求,一旦連接成功,打開會話;會話完成后,關閉Socket。
0~1023的端口號為系統所保留,例如http服務的端口號為80,telnet服務的端口號為21,ftp服務的端口號為23, 所以我們在選擇端口號時,最好選擇一個大于1023的數以防止發生沖突。
簡單的Client/Server示例: 服務器:
[java]
public class Client { public static void main(String[] args) throws Exception { //向本機的5469端口發出客戶請求 Socket socket=new Socket(InetAddress.getLocalHost(),5469); //由Socket對象得到輸入流,并構造相應的BufferedReader對象 BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream())); //由Socket對象得到輸出流,并構造PrintWriter對象 PrintWriter os=new PrintWriter(socket.getOutputStream()); //由系統標準輸入設備構造BufferedReader對象 BufferedReader sin=new BufferedReader(new InputStreamReader(System.in)); while(true){ String str=sin.readLine();//從系統標準輸入讀入一字符串 os.println(str); os.flush(); //刷新輸出流,使Server馬上收到該字符串 String s=is.readLine(); System.out.println("Server : "+s);//在標準輸出上打印從Server讀入的字符串 if(str.equals("end")){ break; } } is.close();//關閉Socket輸入流 os.close();//關閉Socket輸出流 socket.close();//關閉Socket } } 客戶端:
[java]
public class MyServer { public static void main(String[] args) throws Exception{ ServerSocket server=new ServerSocket(5469);//創建一個ServerSocket在端口5469監聽客戶請求 Socket client=server.accept();//使用accept()阻塞等待客戶請求 BufferedReader is=new BufferedReader(new InputStreamReader(client.getInputStream())); PrintWriter os=new PrintWriter(client.getOutputStream()); BufferedReader sin=new BufferedReader(new InputStreamReader(System.in)); while(true){ String str=is.readLine(); System.out.println("Client : "+str);//在標準輸出上打印從Client讀入的字符串 os.println(sin.readLine()); os.flush();//刷新輸出流,使Client馬上收到該字符串 if(str.equals("end")){ break; } } is.close(); os.close(); client.close(); server.close(); } } 回話示例圖:
上邊的代碼只是實現一個客戶端訪問服務器,如果要多個客戶同時訪問一個服務器,那么服務端的代碼就要修改了:
[java]
public class MyServer extends Thread{ Socket client; public MyServer(Socket c){ this.client=c; } public void run() { try{ BufferedReader is=new BufferedReader(new InputStreamReader(client.getInputStream())); PrintWriter os=new PrintWriter(client.getOutputStream()); BufferedReader sin=new BufferedReader(new InputStreamReader(System.in)); while(true){ String s=is.readLine(); System.out.println("Client : "+s);//在標準輸出上打印從Client讀入的字符串 String str=sin.readLine();//從系統標準輸入讀入一字符串 os.println(str); os.flush();//刷新輸出流,使Client馬上收到該字符串 if(str.equals("end")){ break; } } is.close(); os.close(); client.close(); }catch(Exception e){ e.printStackTrace(); } } public static void main(String[] args) throws Exception{ ServerSocket server=new ServerSocket(5469);//創建一個ServerSocket在端口5469監聽客戶請求 while(true){ MyServer s=new MyServer(server.accept());//使用accept()阻塞等待客戶請求 s.start(); } } } 該文章在 2013/2/25 14:15:02 編輯過 |
關鍵字查詢
相關文章
正在查詢... |