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