IPC进程间通信之Socket

材料出自任玉刚大神的《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,连接成功后就可以和服务端进行通信了


猜你喜欢

转载自blog.csdn.net/qq_34591917/article/details/78776202