IPC进程间通信之Socket
来源:互联网 发布:百家讲坛知乎 编辑:程序博客网 时间:2024/06/06 04:02
材料出自任玉刚大神的《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,连接成功后就可以和服务端进行通信了
阅读全文
0 0
- Android进程间通信(IPC)之Socket
- IPC进程间通信之Socket
- IPC之 - C#中用Socket 实现进程间通信
- 进程间通信之:IPC
- php进程间通信ipc及socket
- android进程间通信ipc Socket (二)
- IPC通信之Socket
- 进程间通信(IPC)之管道
- android进程间通信(IPC)之AIDL
- 进程间通信IPC之--共享内存
- 进程间通信IPC之--共享内存
- 进程间通信IPC之--共享内存
- 进程间通信IPC之--共享内存
- Qt之进程间通信(IPC)
- Android进程间通信(IPC)之Messenger
- Android进程间通信(IPC)之AIDL
- 进程间通信之XSI IPC
- 进程间通信(IPC)之管道家族
- Python初级爬虫(0)-爬虫原理
- 语义网基础教程 (第一版)5 逻辑和推理:规则
- 企业级nosql数据库应用与实战-redis
- Tomcat中Connector常用配置
- memset()、memcpy()、strcpy()的用法
- IPC进程间通信之Socket
- SpringBoot 集成 activeMQ
- Druid 配置
- 数组
- BZOJ4537[HNOI2016]最小公倍数
- 定义一个图形类及其子类(三角形类和矩形类),分别计算其面积和周长。
- Pig join cogroup 介绍
- OpenStack API 认证和 API 请求工作流程
- linux环境mysql5.7.20安装