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 }