Android作为服务端,PC推送消息

需求说明:需求大概是这样的红外线激活门禁,门禁激活PC,PC激活Android,Android扫描EPCID,这里的最终要求设备扫描的时间由PC决定,刚开始想法是直接在Android端搭建一个基于NanoHttpd的微型服务器,后来弄清楚之后发现简单多了

第一步:建立Android端的ServerSocket,并接受消息

创建一个ServerSocket,监听端口为9999,端口可为任意一个未被占用的端口

private static void startService() {
    try {
        // 创建ServerSocket
        ServerSocket serverSocket = new ServerSocket(9999);
        Log.e("xxx","--开启服务器,监听端口 9999--");
        // 监听端口,等待客户端连接
        while (true) {
            Log.e("xxx","--等待客户端连接--");
            Socket socket = serverSocket.accept(); //等待客户端连接
            Log.e("xxx","得到客户端连接:" + socket);
            startReader(socket);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

====

接受客户端发送的消息

private static void startReader(final Socket socket) {
    new Thread() {
        @Override
        public void run() {
            DataInputStream reader;
            try {
                // 获取读取流
                reader = new DataInputStream(socket.getInputStream());
                while (true) {
                    Log.e("xxx","*等待客户端输入*");
                    // 读取数据
                    String msg = reader.readUTF();
                    Log.e("xxx","获取到客户端的信息:" + msg);
                    //想客户端返回消息,可用来确认消息的到达
                    DataOutputStream ps = new DataOutputStream(socket.getOutputStream());
                    ps.writeUTF("已收到你发来的信息" + msg);
                    ps.flush();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }.start();
}

以上2个方法就是一个简单的Android端的服务器,比较简短,看下注释应该不难理解

第二步,创建连接,发送消息

连接另一台作为服务端的Android设备

    new Thread() {
        @Override
        public void run() {
            try {
                socket = new Socket("192.168.7.125", 9999);
                Log.e("xxx", "建立连接:" + socket);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }.start();

发送消息

new Thread() {
        @Override
        public void run() {

            try {
                // socket.getInputStream()
                DataOutputStream writer = new DataOutputStream(socket.getOutputStream());

                writer.writeUTF("消息内容"); // 写一个UTF-8的信息

                Log.e("xxx","发送消息");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }.start();

这里得话我是用的另一台Android手机作为客户端,去连接服务端,并发送消息,需要注意的是前几次是不成功的错误信息为没有路由,后来ping一下模拟器的IP发现根本不通,所以先确保网络是连通的,且记得App需要网络权限,网络操作在子线程,还有实际情况中通常客户端会定时发送数据给服务端,确保链接没有断

你可能感兴趣的:(Android作为服务端,PC推送消息)