在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Java/ 請(qǐng)問Java中Socket的心跳包如何實(shí)現(xiàn)?

請(qǐng)問Java中Socket的心跳包如何實(shí)現(xiàn)?

最近在做Socket長連接,出現(xiàn)了一些問題,沒有什么好的思路,希望能夠獲得解答。
我現(xiàn)在只做BIO,也就是傳統(tǒng)IO,阻塞式操作,目的是為了學(xué)習(xí)。所以沒有用NIO,AIO等。
1.客戶端開啟兩個(gè)線程,一個(gè)監(jiān)聽控制臺(tái)輸入,并在這個(gè)線程中再開啟另一個(gè)線程監(jiān)聽服務(wù)端返回的數(shù)據(jù)

            new Thread(new ReadContentTask(bufferedReader)).start();//監(jiān)聽服務(wù)端返回?cái)?shù)據(jù)
            bufferedReader = new BufferedReader(new InputStreamReader(System.in));
            String content = "";
            while (!(content = bufferedReader.readLine()).equals("exit")) {
                //增加一個(gè)\n,由于服務(wù)端讀取數(shù)據(jù)也是使用的readline()方法,該方法只有在識(shí)別到\n時(shí)會(huì)以字符串形式返回這一行的數(shù)據(jù)
                bufferedWriter.write(content + "\n");
                bufferedWriter.flush();
            }

監(jiān)聽服務(wù)端返回?cái)?shù)據(jù)線程代碼:

 @Override
    public void run() {
        try{
            String content = "";
            while((content = bufferedReader.readLine())!=null){
                System.out.println(content);
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            try{
                bufferedReader.close();
            }catch (Exception e2){
                e2.printStackTrace();
            }
        }
    }

服務(wù)端代碼:

bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));//讀取客戶端消息
            bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));//向客戶端寫消息
            String lineString = "";
            //new Thread(new ReceiveHeart(socket)).start();       //開啟心跳檢測(cè)線程
            while (!(lineString = bufferedReader.readLine()).equals("quit")) {
                System.out.println("收到來自客戶端的發(fā)送的消息是:" + lineString);
                bufferedWriter.write("服務(wù)器返回:" + lineString + "\n");
                bufferedWriter.flush();
            }

現(xiàn)在的問題是我想做心跳包,該如何設(shè)計(jì)?
我的想法是比如說客戶端再開啟一個(gè)線程,每隔30秒發(fā)送一個(gè)為"x"的字節(jié)數(shù)組給服務(wù)端,服務(wù)端接收到之后也返回一個(gè)個(gè)"x"給客戶端,并重置心跳時(shí)間。如果客戶端在一定時(shí)間內(nèi)沒收到服務(wù)端返回的數(shù)據(jù),則判斷心跳斷開,開啟新的線程重連。

我現(xiàn)在做的設(shè)計(jì)是客戶端發(fā)送一個(gè)字節(jié)的數(shù)據(jù)給服務(wù)端,同時(shí)客戶端在控制臺(tái)寫的數(shù)據(jù)也發(fā)送給服務(wù)端,兩者走的是同一個(gè)socket的inputstream,服務(wù)端如何區(qū)分收到的消息是心跳消息還是正常消息?

回答
編輯回答
悶油瓶

在消息中設(shè)置一個(gè)位,或者一個(gè)字節(jié)來表示消息的類型,服務(wù)端解析消息后,取出那個(gè)字節(jié),根據(jù)消息的類型處理。

2017年3月7日 07:43