android Socket 实现简单聊天小程序
服务器端:
Java 代码
1. package org.hwq.echo;
2.
3. import java.io.BufferedReader;
4. import java.io.IOException;
5. import java.io.InputStreamReader;
6. import java.io.PrintWriter;
7. import java.net.ServerSocket;
8. import java.net.Socket;
9.
10. public class TalkServer {
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
ServerSocket server = null;
Socket client = null;
BufferedReader in = null;
PrintWriter out = null;
try{
public static void main(String[] args) throws IOException{
server = new ServerSocket(4700);
client = server.accept();
out = new PrintWriter(client.getOutputStream());
in = new BufferedReader(new InputStreamReader(client.getInputStr
eam()));
String line = in.readLine();
while(!"bye".equals(line)){
System.out.println("client:"+line);
out.println("echo:"+line);
out.flush();
line = in.readLine();
}
}catch (Exception e) {
e.printStackTrace();
if(client !=null)
client.close();
if(server != null)
server.close();
}
}
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36. }
手机端:
Java 代码
1. package org.hwq.cho;
2.
3. import java.io.BufferedReader;
4. import java.io.IOException;
5. import java.io.InputStreamReader;
6. import java.io.PrintWriter;
7. import java.net.Socket;
8. import java.net.UnknownHostException;
9.
10. import android.app.Activity;
11. import android.content.Context;
12. import android.os.Bundle;
13. import android.os.Handler;
14. import android.os.Message;
15. import android.view.View;
16. import android.view.View.OnClickListener;
17. import android.widget.Button;
18. import android.widget.EditText;
19. import android.widget.Toast;
20.
21. public class EchoActivity extends Activity implements OnClickListener {
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40. //
EditText show,msg;
Button send;
Handler handler;
Socket client;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
handler = new MyHandler();
show = (EditText) findViewById(R.id.show);
msg = (EditText) findViewById(R.id.msg);
send = (Button) findViewById(R.id.send);
send.setOnClickListener(this);
}
@Override
public void onClick(View arg0) {
String message = msg.getText().toString();
System.out.println("msg:"+message);
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
new EchoThread(EchoActivity.this,message).start();
}
public class MyHandler extends Handler{
@Override
public void handleMessage(Message msg) {
switch(msg.what){
case 1:
Toast.makeText(EchoActivity.this, "建立连接失败", 0).show
();
break;
case 2:
String message = (String) msg.obj;
System.out.println("Handler:"+message);
show.append("\n"+message);
break;
}
}
}
private class EchoThread extends Thread{
private Context context;
private String msg;
EchoThread(Context context,String msg){
this.context = context;
this.msg = msg;
}
public void run(){
if(client == null){
try {
client = new Socket("192.168.1.102",4700);
} catch (IOException e) {
Message message = new Message();
message.what = 1;
handler.sendMessage(message);
}
}
System.out.println("建立连接");
try{
BufferedReader in;
BufferedReader input;
PrintWriter out;
in = new BufferedReader(new InputStreamReader(client.getInpu
tStream()));
out = new PrintWriter(client.getOutputStream());
String line = msg;
if(!"bye".equals(line)){
System.out.println("line:"+line);
out.println(line);
out.flush();
String echo = in.readLine();
System.out.println("server:"+echo);
Message message = new Message();
message.obj = echo;
message.what = 2;
handler.sendMessage(message);
}
}catch (Exception e) {
}
}
}
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99. }
注意几点:
1、添加网络权限
Java 代码
1.
如果没添加,无法使用 socket 连接网络。
2、在新启线程中不要使用 android 系统 UI 界面
在 EchoThrad 的 run()方法里面,有下面代码:
Java 代码
try {
client = new Socket("192.168.1.102",4700);
1. if(client == null){
2.
3.
4.
5.
6.
7.
8.
9.
}
}
} catch (IOException e) {
Message message = new Message();
message.what = 1;
handler.sendMessage(message);
这里的 handler.sendMessage(message);是发送一个消息给 handler,
然后 handler 根据消息弹出一个 Toast 显示连接失败。如果这里直接使
用
Java 代码
1. Toast.makeText(EchoActivity.this, "建立连接失败", 0).show();
会报如下错:
Java 代码
1. Can't create handler inside thread that has not called Looper.prepare()