多客户端和服务器通信的基本流程:

 1 package com.bwf.tcp_cleint;
 2 
 3 import java.text.SimpleDateFormat;
 4 import java.util.Date;
 5 
 6 import android.os.Build;
 7 import android.os.Bundle;
 8 import android.os.Handler;
 9 import android.os.Message;
10 import android.app.Activity;
11 import android.view.Menu;
12 import android.view.View;
13 import android.view.View.OnClickListener;
14 import android.widget.Button;
15 import android.widget.EditText;
16 import android.widget.ScrollView;
17 import android.widget.TextView;
18 /**
19  * 多客户端和服务器通信的基本流程:
20  *         1. 在某个客户端的EditText输入要发送的内容
21  *         2. 点击Button的时候把要发送的内容通过Handler发送到子线程CleintHandler
22  *         3. 子线程中的CleintHandler收到MSG之后,把其中的数据通过Socket流写入
23  *         4. 在Server端会读取到客户端写入的内容
24  *         5. 在Server中把读取到的数据分别写入所有Socket
25  *         6. 可以在客户端的子线程中读取到Server发送的信息
26  *         7. 在子线程中通过UIHandler发消息,通知UI来更新
27  *         8. 重复上述过程
28  * */
29 public class MainActivity extends Activity {
30     SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
31     EditText edt_input;
32     TextView tv_show;
33     Button btn_send;
34     
35     CleintThread cleintThread;
36     
37     // 更新UI上TextView显示
38     Handler uiHandler;
39     
40     // ScrollView
41     ScrollView scrollView;
42     @Override
43     protected void onCreate(Bundle savedInstanceState) {
44         super.onCreate(savedInstanceState);
45         setContentView(R.layout.activity_main);
46         
47         init();
48     }
49 
50     Build bd = new Build();    
51     String model;
52     private void init() {
53         model = bd.MODEL;
54         edt_input = (EditText) findViewById(R.id.edt_input);
55         tv_show = (TextView) findViewById(R.id.tv_show);
56         scrollView = (ScrollView) findViewById(R.id.scrollView);
57         
58         uiHandler = new Handler(){
59                 public void handleMessage(android.os.Message msg) {
60                     if(msg.what == 0){
61                         tv_show.append(msg.obj+"\n");
62                         // 滑动到底部
63                         scrollView.fullScroll(ScrollView.FOCUS_DOWN);
64                         // 滑动到顶部
65                         //scrollView.fullScroll(ScrollView.FOCUS_UP);
66                     }
67                 };
68             };
69         
70         cleintThread = new CleintThread(uiHandler);
71         // 启动客户端线程
72         new Thread(cleintThread).start();
73     }
74 
75     @Override
76     public boolean onCreateOptionsMenu(Menu menu) {
77         // Inflate the menu; this adds items to the action bar if it is present.
78         getMenuInflater().inflate(R.menu.main, menu);
79         return true;
80     }
81 
82     public void mainClick(View v){
  1 package com.bwf.tcp_cleint;
  2 
  3 import java.io.BufferedReader;
  4 import java.io.IOException;
  5 import java.io.InputStreamReader;
  6 import java.io.OutputStream;
  7 import java.io.UnsupportedEncodingException;
  8 import java.net.Socket;
  9 import java.net.UnknownHostException;
 10 import java.text.SimpleDateFormat;
 11 import java.util.Date;
 12 
 13 import android.os.Build;
 14 import android.os.Handler;
 15 import android.os.Looper;
 16 import android.os.Message;
 17 import android.util.Log;
 18 
 19 public class CleintThread implements Runnable {
 20     SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 21 
 22     Handler handler;
 23 
 24     public Handler cleintHandler;
 25 
 26     Socket s;
 27     BufferedReader br;
 28     OutputStream out;
 29 
 30     public CleintThread(Handler handler) {
 31         super();
 32         this.handler = handler;
 33     }
 34 
 35     @Override
 36     public void run() {
 37         try {
 38             s = new Socket("192.168.10.124", 8000);
 39             br = new BufferedReader(new InputStreamReader(s.getInputStream()));
 40 
 41             out = s.getOutputStream();
 42 
 43             // 开启一个线程读取服务器返回的数据
 44             new Thread(new Runnable() {
 45 
 46                 @Override
 47                 public void run() {
 48 
 49                     String data = "";
 50                     try {
 51                         while ((data = br.readLine()) != null) {
 52                             // 读取到服务器返回时,发消息给UI中的Handler更新UI
 53                             Message msg = Message.obtain();
 54                             msg.what = 0;
 55                             msg.obj = data;
 56                             handler.sendMessage(msg);
 57                         }
 58                     } catch (Exception e) {
 59                         // TODO Auto-generated catch block
 60                         e.printStackTrace();
 61                     }
 62                 }
 63             }).start();
 64 
 65             // 准备Looper
 66             Looper.prepare();
 67             // 创建Handler以便接收处理UI端发送来的消息,将其写入Socket流中
 68             cleintHandler = new Handler() {
 69                 @Override
 70                 public void handleMessage(Message msg) {
 71                     if (msg.what == 1) {
 72                         try {
 73                             String name = new Build().MODEL;
 74                             int len = name.length();
 75                             int nameMax = 20;
 76                             if(len < nameMax){
 77                                 for (int i = 0; i < nameMax - len; i++) {
 78                                     name += " ";
 79                                 }
 80                             } else{
 81                                 name = name.substring(0, nameMax);
 82                             }
 83                             
 84                             out.write((name
 85                                     + format.format(new Date(System
 86                                             .currentTimeMillis()))
 87                                     + "\r\n" + msg.obj+"\n")
 88                                     .getBytes("utf-8"));
 89                         } catch (Exception e) {
 90                             // TODO Auto-generated catch block
 91                             e.printStackTrace();
 92                         }
 93                     }
 94                 }
 95             };
 96 
 97             // 激活消息队列
 98             Looper.loop();
 99         } catch (Exception e) {
100             // TODO Auto-generated catch block
101             Log.d("fanhy", "连接服务器失败。");
102             e.printStackTrace();
103         }
104     }
105 
106 }

 

83         switch (v.getId()) {
84         case R.id.btn_send:
85             Message msg = Message.obtain();
86             msg.what = 1;
87             msg.obj = edt_input.getText()+"";
88             // 将EditText中的输入传递给客户端线程进行发送到服务器
89             cleintThread.cleintHandler.sendMessage(msg);
90             // 发送后清空EditText
91             edt_input.setText("");
92             break;
93 
94         default:
95             break;
96         }
97     }
98 }

 

posted @ 2015-11-07 17:27  Joelwang  阅读(412)  评论(0编辑  收藏  举报