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 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,264评论 25 708
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,923评论 18 139
  • 点击查看原文 Web SDK 开发手册 SDK 概述 网易云信 SDK 为 Web 应用提供一个完善的 IM 系统...
    layjoy阅读 13,928评论 0 15
  • 早上早早起了床,把自己收拾得美美的与儿子去上最后一次早教课,顺利地坐上公交车,人很少,我们俩各坐一个座位,...
    利利lili阅读 288评论 3 5
  • 【同读一本书】2016-03-09-092 正文:在开始的时候拒绝总比在最后拒绝容易得多。 思考:当我们面对两难的...
    楼小楼_elf阅读 812评论 13 0