socket貌似一直是一个通讯重点
本文,实现socket双向通讯,多线程
客户端:
package kyrinleo.socket.client;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.Socket;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
/**
* SocketClient
* @author Kyrinleo (kyrinleo@foxmail.com)
* */
public class SocketClientActivity extends Activity {
Button btn;
TextView txt;
String i ="n";
EditText ed;
Socket client;
public static final String IP = "192.168.0.102";//服务器地址
public static final int PORT = 2014;//服务器端口号
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btn=(Button)findViewById(R.id.button1);
txt=(TextView)findViewById(R.id.txt);
ed=(EditText)findViewById(R.id.editText1);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
new Thread(new WriteHandlerThread(client)).start();
}
});
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
clientsocket();
}
}).start();
}
private void clientsocket(){
try {
//实例化一个Socket,并指定服务器地址和端口
client = new Socket(IP, PORT);
//开启线程负责读
new Thread(new ReadHandlerThread(client)).start();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 读操作
* */
class ReadHandlerThread implements Runnable{
private Socket client;
public ReadHandlerThread (Socket client){
this.client =client;
}
@Override
public void run() {
// TODO Auto-generated method stub
DataInputStream dis =null;
try {
while (true) {
dis=new DataInputStream(client.getInputStream());
i=dis.readUTF();
mhandler.sendEmptyMessage(1);
}
} catch (Exception e) {
// TODO: handle exception
}
}
}
/**
* 写操作
* */
class WriteHandlerThread implements Runnable{
private Socket client;
public WriteHandlerThread(Socket client){
this.client=client;
}
@Override
public void run() {
// TODO Auto-generated method stub
DataOutputStream dos =null;
try {
// while (true) {
dos=new DataOutputStream(client.getOutputStream());
String ss=ed.getText().toString();
dos.writeUTF(ss);
// }
} catch (Exception e) {
// TODO: handle exception
}
}
}
Handler mhandler=new Handler(){
public void handleMessage(android.os.Message msg) {
if (msg.what==1) {
txt.setText(i);
};
};
};
}
服务器端代码:
package kyrinleo.socket.server;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
/**
* SocketServer
* @author Kyrinleo (kyrinleo@foxmail.com)
* */
public class SocketServerActivity extends Activity {
Button btn;
TextView txt;
String i ="n";
int PORT=2014;
EditText ed;
Socket client;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btn=(Button)findViewById(R.id.button1);
txt=(TextView)findViewById(R.id.txt);
ed=(EditText)findViewById(R.id.editText1);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
new Thread(new WriteHandlerThread(client)).start();
}
});
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
init();
}
}).start();
}
public void init() {
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(PORT);
while (true) {
client = serverSocket.accept();
//线程处理读
new Thread(new ReadHandlerThread(client)).start();
}
} catch (Exception e) {
e.printStackTrace();
} finally{
try {
if(serverSocket != null){
serverSocket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 读操作Thread
* */
public class ReadHandlerThread implements Runnable{
private Socket client;
public ReadHandlerThread(Socket client) {
this.client = client;
}
@Override
public void run() {
// TODO Auto-generated method stub
DataInputStream dis =null;
try {
while (true) {
dis=new DataInputStream(client.getInputStream());
i=dis.readUTF();
mhandler.sendEmptyMessage(1);
}
} catch (Exception e) {
// TODO: handle exception
}
}
}
/**
* 写操作Thread
* */
public class WriteHandlerThread implements Runnable{
private Socket client;
public WriteHandlerThread(Socket client) {
this.client = client;
}
@Override
public void run() {
// TODO Auto-generated method stub
DataOutputStream dos = null;
BufferedReader br = null;
try {
// while (true) {
dos=new DataOutputStream(client.getOutputStream());
String send =ed.getText().toString();
dos.writeUTF(send);
// }
} catch (Exception e) {
// TODO: handle exception
}
}
}
Handler mhandler=new Handler(){
public void handleMessage(android.os.Message msg) {
if (msg.what==1) {
txt.setText(i);
};
};
};
}