Android 开发即时聊天工具 YQ :(一) Socket 初步
這段時間在學(xué)習(xí)Android網(wǎng)絡(luò)編程,習(xí)慣一邊寫個簡單的項(xiàng)目一邊學(xué)習(xí),所以就有了這個簡易的簡易的,,,項(xiàng)目,
類似于手機(jī)QQ等等的即時聊天工具,當(dāng)然功能及其簡單,跟那些沒法比,只是學(xué)習(xí),實(shí)現(xiàn)簡單功能就OK,
聽說QQ是有自己的協(xié)議的,貌似挺復(fù)雜,,,
只為學(xué)習(xí)交流之用,而且本人也是Android小菜鳥一枚,錯誤或不足在所難免,請大家多多指正,3Q~
先看看socket通信基礎(chǔ):
所謂socket通常也稱作"套接字",用于描述IP地址和端口,是一個通信鏈的句柄。應(yīng)用程序通常通過"套接字"向網(wǎng)絡(luò)發(fā)出請求或者應(yīng)答網(wǎng)絡(luò)請求。?
Socket和ServerSocket類庫位于java.net包中。ServerSocket用于服務(wù)器端,Socket是建立網(wǎng)絡(luò)連接時使用的。在連接成功時,應(yīng)用程序兩端都會產(chǎn)生一個Socket實(shí)例,操作這個實(shí)例,完成所需的會話。
服務(wù)器:
使用ServerSocket監(jiān)聽指定的端口,等待客戶連接請求,客戶連接后,會話產(chǎn)生;在完成會話后,關(guān)閉連接。?
客戶端:
使用Socket對網(wǎng)絡(luò)上某一個服務(wù)器的某一個端口發(fā)出連接請求,一旦連接成功,打開會話;會話完成后,關(guān)閉Socket。
0~1023的端口號為系統(tǒng)所保留,例如http服務(wù)的端口號為80,telnet服務(wù)的端口號為21,ftp服務(wù)的端口號為23,?所以我們在選擇端口號時,最好選擇一個大于1023的數(shù)以防止發(fā)生沖突。
簡單的Client/Server示例:
服務(wù)器:
public class Client {public static void main(String[] args) throws Exception {//向本機(jī)的5469端口發(fā)出客戶請求Socket socket=new Socket(InetAddress.getLocalHost(),5469);//由Socket對象得到輸入流,并構(gòu)造相應(yīng)的BufferedReader對象BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));//由Socket對象得到輸出流,并構(gòu)造PrintWriter對象PrintWriter os=new PrintWriter(socket.getOutputStream());//由系統(tǒng)標(biāo)準(zhǔn)輸入設(shè)備構(gòu)造BufferedReader對象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} }
客戶端:
public class MyServer {public static void main(String[] args) throws Exception{ServerSocket server=new ServerSocket(5469);//創(chuàng)建一個ServerSocket在端口5469監(jiān)聽客戶請求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);//在標(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)一個客戶端訪問服務(wù)器,如果要多個客戶同時訪問一個服務(wù)器,那么服務(wù)端的代碼就要修改了:
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)建一個ServerSocket在端口5469監(jiān)聽客戶請求while(true){MyServer s=new MyServer(server.accept());//使用accept()阻塞等待客戶請求s.start();}} }
謝謝大家支持!歡迎一起學(xué)習(xí)交流!
轉(zhuǎn)載請注明出處:http://blog.csdn.net/mimitracely總結(jié)
以上是生活随笔為你收集整理的Android 开发即时聊天工具 YQ :(一) Socket 初步的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 文章整理 - 匠人精神
- 下一篇: Android 开发即时聊天工具系列(8