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,连接成功后就可以和服务端进行通信了