java socket 通信,用於各種無線網絡通信

無論是使用Wi-Fi模塊在單片機和電腦或手機之間進行數據傳輸,基本方法都是:

一臺設備建立服務端,一臺設備作爲客戶端連接,連接成功後即可進行通信。

一、服務端的建立

Java中建立服務端,不侷限於電腦才能建立,一臺手機同樣可以建立:

 
    /**
     * 建立服務端
     *
     * @param sp 建立服務端的通信端口
     */
    private static void StartServer(int sp) {
        try {
            serverSocket = new ServerSocket(sp);   //服務端使用ServerSocket建立
            System.out.println("Server started at:" + InetAddress.getLocalHost());
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        new Thread(){
            @Override
            public void run() {
                while (SERVER_ENABLE) { //循環監聽
                    try {
                        s = serverSocket.accept(); //在有客戶端連入之前,while循環將一直卡在這裏
                        new MasterServerThread(s).start(); //客戶端連接成功後,開啓一個自定義的服務器線程
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }.start();
    }

二、服務線程

  
    /**
     * 服務器主線程
     */
    private static class MasterServerThread extends Thread {

        Socket masterSocket = null; //傳入的客戶端Socket
        String socketKind = null;

        //構造方法,在實例化本Class時要求傳入客戶端的socket
        public MasterServerThread(Socket s) {
            this.masterSocket = s;
        }

        @Override
        public void run() {
            BufferedReader bre = null;
            try {
                bre = new BufferedReader(new InputStreamReader(masterSocket.getInputStream(), "utf-8"));
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                while ((socketKind = bre.readLine()) != null) { //接收讀取傳輸過來的數據 
                    //根據發過來的數據是什麼,決定進行指定操作        
                     if (socketKind.contains(LOGIN_REQUEST)) {//TODO 處理登陸請求操作
                           //......
                     } else if (socketKind.contains(OPERATION_OF_BINDING_DEVICE)) {//TODO 處理設備綁定
                           //......
                     }                 
                }
            } catch (Exception e) {
                //e.printStackTrace();
            }
        }
    }

三、客戶端的連接

/**
*    SERVER_IP : String型
*  SERVER_PORT :int型
*/

Socket socket = new Socket(SERVER_IP, SERVER_PORT); //服務端用的ServerSocket,客戶端對應的是使用Socket
ClientThread ct = new ClientThread(socket);  //同樣開啓客戶端線程,與服務器通信用
ct.start();

四、客戶端線程

 
    /**
     * Class : ClientThread
     * 與服務端線程class十分相像
     */
    private class ClientThread extends Thread {
        Socket cSocket;
        BufferedReader br;

        public ClientThread(Socket s) {
            this.cSocket = s;
        }

        @Override
        public void run() {
            try {
                br = new BufferedReader(new InputStreamReader(cSocket.getInputStream(), "UTF-8"));
                while ((temp = br.readLine()) != null) {
                    //Do Something...
                   }
            }catch(IOException e){
                e.printStackTrace();
            }

        }
    }

五、發送消息

 /**
     * 發送登陸信息
     * @param id 用戶ID
     * @param pwd 賬號密碼
     */
    private void sendLoginMsg(final String id, final String pwd) {

        new Thread() {
            @Override
            public void run() {
                try {
                    PrintWriter printWriter = new PrintWriter(socket.getOutputStream());
                    printWriter.println(LOGIN_REQUEST + "CONNECTION_FROM_APP" + "_" + id + "$" + pwd + "&");
                    printWriter.flush();
                } catch (IOException e) {
                    e.printStackTrace();

                }
            }
        }.start();


    }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章