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