实现Socket聊天其实质就是一个Socket的双向通信,分为服务端和客户端,都是 需要得到一个socket对象,通过socket获取流得到我们需要的数据。
标准的写法都是开启一个while(true)的线程不断的去监听接收消息,另外启一个线程去发送消息。为了方便演示效果这里写了一个Winform应用作为服务端。客户端和服务端的代码基本上完全相同。下面给出
android收发数据主要代码。
接收数据:
private class ReceiveThread extends Thread {
private InputStream inStream = null;
private byte[] buffer;
private String str = null;
ReceiveThread(Socket socket) {
try {
inStream = socket.getInputStream();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void run() {
while (true) {
buffer = new byte[512];
try {
inStream.read(buffer);//读流方式应该和发送一致
//(read、readUTF),否则阻塞
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
str = new String(buffer, "UTF-8").trim();
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (buffer.length > 0) {
Message msg = Message.obtain();
msg.obj = str;
msg.what = MSG_REC;
myHandler.sendMessage(msg);//将获取的数据发送出去
}
}
}
}
发送数据:
Runnable sendThread = new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
byte[] sendBuffer = null;
try {
sendBuffer = strMessage.getBytes("UTF-8");
} catch (UnsupportedEncodingException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try {
outStream = socket.getOutputStream();
Message msg = Message.obtain();
msg.obj = strMessage;
msg.what = MSG_SEND;
myHandler.sendMessage(msg);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
outStream.write(sendBuffer);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
来看看效果吧:
android:
![android聊天截图](http://i2.piimg.com/571693/a18aae06c0cc261bs.png)
PC:
![PC端聊天截图](http://i2.piimg.com/571693/d34ad67a996342a5s.png)
源码下载,点击这里
http://download.csdn.net/detail/mythace/9600070