一對一Socket簡單聊天的實現


  今天終於調試通了Socket一對一的聊天,每次發送連接請求后,將用戶名發送到Socket中去,然后將用戶名和新建的socket存到map中,然后根據用戶名來確定接收方是誰,以實現一對一的聊天功能。

  上圖是我看博客的時候截下來的圖,這就是大概思路了。具體今天的實現,我寫了一個界面,上邊有服務器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,這樣互相發送消息,實現的效果如下圖所示:

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

  

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

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM