材料出自任玉刚大神的《Android开发艺术探索》
Socket实现进程间的通信
socket也称为套接字 分为流式套接字和用户数据报套接字,分别对应网络的传输控制协议的TCP和UDP协议。
TCP协议是面向连接的协议,提供稳定的双向通信功能,连接的建立需要经过“三次握手”才可以完成,本身提供了超时重传机制,因此具有很高的稳定性。
UDP 是无连接的,提供不稳定的单向通信功能,当然UDP也可以实现双向通信功能。性能上拥有更好的效率,缺点是不能保证数据能够正确的传输。
使用Socket来进行通信,有两点需要注意,需要声明权限
"android.permission.INTERNET"
"android.permission.ACCESS_NETWORK_STATE"
不能在主线程中访问网络,否则这会导致我们的程序无法在Android 4.0以上的设备中运行,其次访问网络本身就是一个耗时操作,放在主线程中会影响程序的响应效率。
----------
下面是用socket来实现一个简单的聊天室进程间通信的业务逻辑
**服务端设计**
*总体是Android开发艺术探索这本书关于本篇服务端所需要实现的内容*
service启动,在线程中建立TCP服务,端口号为8688。等待客户端连接
服务端收到客户端的消息就随机回复一句话返回给客户端
客户端断开连接的时,服务端也会相应的关闭对应的Socket并结束通话线程
*之前就有说过不能再主线程中访问网络*
单独new一个子线程出来去执行访问网络的逻辑
public void onCreate() {
new Thread(new TcpServer());
super.onCreate();
}
----------
private class TcpServer implements Runnable{
@Override
public void run() {
ServerSocket serverSocket = null;
try {
/**
* 监听8688端口 等待客户端的连接请求当客户端连接时就会生成一个socket
* 每次创建新的socket就可以分别和不同的客户端通信了
*/
serverSocket = new ServerSocket(8688);
} catch (IOException e) {
System.out.println("failed,port:8688");
e.printStackTrace();
return;
}
while (!mIsServiceDestoryed){
try {
//接收客户端请求
final Socket clientRequest = serverSocket.accept();
System.out.println("接收到客户端的请求");
new Thread(){
@Override
public void run() {
try {
//创建一个回复客户端的方法
responseClient(clientRequest);
} catch (IOException e) {
e.printStackTrace();
}
};
}.start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
private void responseClient(Socket clientRequest) throws IOException {
/**
* 1.接收客户端消息
* 2.用于向客户端发送消息
* 3.客户端断开连接
*/
BufferedReader in = new BufferedReader(new InputStreamReader(clientRequest.getInputStream()));
PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(clientRequest.getOutputStream())),true);
out.println("欢迎来到聊天室");
while(!mIsServiceDestoryed){
String str = in.readLine();
System.out.println("消息" + str);
if(str == null){
//客户端断开连接
break;
}
int i = new Random().nextInt(message.length);
String msg = message[i];
out.println(msg);
System.out.println("发送" + msg);
System.out.println("客户端退出");
in.close();
out.close();
clientRequest.close();
}
}
}
----------
**客户端**
----------
客户端设计思路
在onCreate()中开启一个线程去连接服务器Socket,连接成功后就可以和服务端进行通信了