[b][size=large][color=red]android Socket实现简单聊天小程序[/color][/size][/b]

服务器端:

package org.hwq.echo;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class TalkServer {
public static void main(String[] args) throws IOException{
ServerSocket server = null;
Socket client = null;
BufferedReader in = null;
PrintWriter out = null;
try{
server = new ServerSocket(4700);
client = server.accept();
out = new PrintWriter(client.getOutputStream());
in = new BufferedReader(new InputStreamReader(client.getInputStream()));
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();
}
}
}


手机端:
package org.hwq.cho;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class EchoActivity extends Activity implements OnClickListener {
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);
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.getInputStream()));
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) {

}
}
}
}


[size=medium][color=red]注意几点:[/color][/size]
[size=medium][color=red]1、添加网络权限[/color][/size]

[size=medium][color=green]如果没添加,无法使用socket连接网络。[/color][/size]
[size=medium][color=red]2、在新启线程中不要使用android系统UI界面[/color][/size]
[size=medium][color=green]在EchoThrad的run()方法里面,有下面代码:[/color][/size]
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);
}
}

[size=medium][color=green]这里的handler.sendMessage(message);是发送一个消息给handler,然后handler根据消息弹出一个Toast显示连接失败。如果这里直接使用[/color][/size]
Toast.makeText(EchoActivity.this, "建立连接失败", 0).show();

[size=medium][color=green]会报如下错:[/color][/size]
Can't create handler inside thread that has not called Looper.prepare()

更多相关文章

  1. 在Fragment中设置控件点击方法,执行失败。
  2. Android的网络状态判断
  3. Android打开/关闭数据流量
  4. 重定向android log
  5. 【android测试】值得学习的android测试知识连接
  6. 安卓9.0 http请求数据失败解决办法
  7. android之launcher时序图and图标的建立
  8. 几个Android小错误解决方法
  9. android > 建立WIFI 热点

随机推荐

  1. 彻底搞定HashMap面试问题!!!
  2. 3-7(单链表的相关算法题)
  3. MySQL基础知识——管理和连接
  4. 使用graylog2收集dhcp日志
  5. MySQL基础知识——安装
  6. 这该死的游标,怎么这么难呢?
  7. LVS NAT原理、配置
  8. VmwareWorkstation 16无法安装VMware Too
  9. Mac系统上查看端口占用和释放端口教程
  10. 职场里,对数据库要有敬畏之心!