今天終於調試通了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)