Socket 实现跨进程通信

一、项目配置:

需要在AndroidManifest.xml中声明权限

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

//将SocketServerService服务声明为远程服务端
 <service
        android:name=".service.SocketServerService"
        android:process=":remote" />
二、Socket服务端

1、在SocketServerService启动时创建线程,用来监听端口

//在Service启动时创建线程,在线程中建立服务,监听端口,等待客户端连接
public class SocketServerService extends Service {
    private boolean isServiceDestroyed = false;

    @Override
    public void onCreate() {
        new Thread(new TcpServer()).start();
        super.onCreate();
    }

    @Override
    public IBinder onBind(Intent intent) {
        throw new UnsupportedOperationException("Not yet implemented");
    }

    private class TcpServer implements Runnable {
        @Override
        public void run() {
            ServerSocket serverSocket;
            try {
                //监听8688端口
                serverSocket = new ServerSocket(8688);
            } catch (IOException e) {
                return;
            }
            while (!isServiceDestroyed) {
                try {
                //接受客户端请求,并且阻塞直到接收到消息
                    final Socket client = serverSocket.accept();
                    new Thread() {
                        @Override
                        public void run() {
                            try {
                                responseClient(client);
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }
                    }.start();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    private void responseClient(Socket client) throws IOException {
        //用于接收客户端消息
        BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
        //用于向客户端发送消息
        PrintWriter out = new PrintWriter(new BufferedWriter(new
                OutputStreamWriter(client.getOutputStream())), true);
        out.println("你好,我是服务端");
        while (!isServiceDestroyed) {
            String str = in.readLine();
            if (TextUtils.isEmpty(str)) {
               //客户端断开了连接
                break;
            }
            String message = "收到了客户端的信息为:" + str;
            //从客户端收到的消息加工再发送给客户端
            out.println(message);
        }
        out.close();
        in.close();
        client.close();
    }

    @Override
    public void onDestroy() {
        isServiceDestroyed = true;
        super.onDestroy();
    }
}
三、客户端
public class SocketServerActivity extends AppCompatActivity {
    private TextView tvMessage;
    private EditText etReceive;
    private Button btSend;
    private PrintWriter mPrintWriter;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.socket_layout);
        initView();
        initAction();
        //启动服务端
        Intent intent = new Intent(this, SocketServerService.class);
        startService(intent);
		//开启线程连接服务端
        new Thread() {
            @Override
            public void run() {
                super.run();
                connectSocketServer();
            }
        }.start();
    }

    private void initView() {
        tvMessage = findViewById(R.id.tv_message);
        etReceive = findViewById(R.id.et_receive);
        btSend = findViewById(R.id.bt_send);
    }

    private void initAction() {
        btSend.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                final String msg = etReceive.getText().toString();
                //向服务器发送消息
                if (!TextUtils.isEmpty(msg) && null != mPrintWriter) {
                    new Thread(new Runnable() {
                        @Override
                        public void run() {
                            mPrintWriter.println(msg);
                        }
                    }).start();
                    tvMessage.setText(tvMessage.getText() + "\n" + "客户端:" + msg);
                    etReceive.setText("");
                }
            }
        });
    }

    private void connectSocketServer() {
        Socket socket = null;
        while (null == socket) {
            try {
                //选择和服务器相同的端口8688
                socket = new Socket("localhost", 8688);
                mPrintWriter = new PrintWriter(new BufferedWriter(new
                        OutputStreamWriter(socket.getOutputStream())),true);
            } catch (IOException e) {
                SystemClock.sleep(1000);
            }
        }
        try {
            //接收服务端的消息
            BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
            while (!isFinishing()){
                final String msg =br.readLine();
                if (null!=msg){
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            tvMessage.setText(tvMessage.getText()+"\n"+"服务端:"+msg);
                        }
                    });
                }
            }
            mPrintWriter.close();
            br.close();
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

本文代码是参考刘望舒的《android 进阶指北》,如有侵权,可立即删除

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值