天天看點

一對一Socket簡單聊天的實作

  今天終于調試通了Socket一對一的聊天,每次發送連接配接請求後,将使用者名發送到Socket中去,然後将使用者名和建立的socket存到map中,然後根據使用者名來确定接收方是誰,以實作一對一的聊天功能。

一對一Socket簡單聊天的實作

  上圖是我看部落格的時候截下來的圖,這就是大概思路了。具體今天的實作,我寫了一個界面,上邊有伺服器ip位址,用來連接配接伺服器。

  以及發送方,接收方,消息内容。發送的時候,将這三條資料連接配接起來,末尾加"\n",以便readLine()函數讀取内容。然後發送消息。三個按鈕的單擊事件如下所示,界面在後邊會貼出來。

1     //*****************************主要工作********************************
 2     Socket socket = null;
 3     BufferedReader br = null;
 4     BufferedWriter bw = null;
 5     protected void connect() {
 6 
 7         
 8         AsyncTask<Void, String, Void> reader = new AsyncTask<Void, String, Void>(){
 9 
10             @Override
11             protected Void doInBackground(Void... arg0) {
12                 try {
13                     socket = new Socket(editIp.getText().toString(), 12345);
14                     br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
15                     bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
16                     publishProgress("@success");
17                 } catch (UnknownHostException e1) {
18                     Toast.makeText(MainActivity.this, "無法建立連接配接", Toast.LENGTH_SHORT).show();
19                 } catch (IOException e1) {
20                     Toast.makeText(MainActivity.this, "無法建立連接配接", Toast.LENGTH_SHORT).show();
21                 }
22                 try {
23                     String line = "";
24                     while((line = br.readLine()) != null){
25                         publishProgress(line);
26                     }
27                 } catch (IOException e) {
28                     // TODO Auto-generated catch block
29                     e.printStackTrace();
30                 }
31                 return null;
32             }
33 
34 
35             @Override
36             protected void onProgressUpdate(String... values) {
37                 // TODO Auto-generated method stub
38                 if (values[0].equals("@success")) {
39                     Toast.makeText(MainActivity.this, "連接配接成功", Toast.LENGTH_SHORT).show();                    
40                 }
41                 tvNeirong.append("對方說:"+values[0]+"\n");
42                 super.onProgressUpdate(values);
43             }
44         };
45         reader.execute();
46 
47     }
48     protected void login() {
49         // TODO Auto-generated method stub
50         try {
51             bw.write(editUsername.getText().toString()+"\n");
52             bw.flush();
53         } catch (IOException e) {
54             // TODO Auto-generated catch block
55             e.printStackTrace();
56         }
57 
58     }
59     protected void send() {
60         // TODO Auto-generated method stub
61         try {
62             tvNeirong.append("我說:"+editContent.getText().toString()+"\n");
63             //将消息内容連接配接為一個字元串,格式為FromID \n Content \n ToID \n
64             //因為将來讀取時候用的是readLine()函數,是以必須加\n
65             String str = editUsername.getText().toString()+"\n"
66                     +editContent.getText().toString()+"\n"
67                     +editToID.getText().toString()+"\n";
68             bw.write(str);
69             bw.flush();
70             editContent.setText("");
71         } catch (IOException e) {
72             // TODO Auto-generated catch block
73             e.printStackTrace();
74         }
75 
76     }      

  然後我開了三個安卓模拟器,兩個Eclipse,電腦記憶體飙到了百分之八十多,測試完成後趕緊關了,一頓卡,大概如下所示,三個使用者為10001,10002,10003,我讓10001->10002,10002->10003,10003->10001,這樣互相發送消息,實作的效果如下圖所示:

一對一Socket簡單聊天的實作

  然後貼出我的ServerSocket中的logcat内容,這些消息是封裝成了Json字元串來發送的。

  

一對一Socket簡單聊天的實作

  消息的格式為FromID+"\n"+Content+"\n"+ToID+"\n",這樣就組成了一個完整的字元串,readLine()函數遇到"\n"就會停止,每次将對應的變量解析出來,然後服務端再去發送消息就可以了。

  好了,有什麼問題還會來這裡補充,(僅供自己學習參考0.0)