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閱讀 172,809評論 25 708
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,836評論 18 139
  • 點擊查看原文 Web SDK 開發手冊 SDK 概述 網易云信 SDK 為 Web 應用提供一個完善的 IM 系統...
    layjoy閱讀 13,854評論 0 15
  • 早上早早起了床,把自己收拾得美美的與兒子去上最后一次早教課,順利地坐上公交車,人很少,我們倆各坐一個座位,...
    利利lili閱讀 288評論 3 5
  • 【同讀一本書】2016-03-09-092 正文:在開始的時候拒絕總比在最后拒絕容易得多。 思考:當我們面對兩難的...
    樓小樓_elf閱讀 808評論 13 0