最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java Socket循環(huán)接收數(shù)據(jù)readLine()阻塞的解決方案

 更新時間:2024年08月13日 08:38:16   作者:曲幽  
這篇文章主要介紹了Java Socket循環(huán)接收數(shù)據(jù)readLine()阻塞的解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

寫在前面

只能說基礎不牢吧,代碼邏輯一切OK,就是接收不到服務器信息,發(fā)送沒問題。

因為服務器不是我能控制的,只能在客戶端想辦法解決,后來斷點知道了readLine()阻塞的情況,大無語呀,阻塞好是好,但你要換行符,我哪知道服務器給的是什么。

這里socket的連接之類的代碼很多,就不重復貼了,只放些解決方案供有同樣問題的朋友參考

解決方案一 加換行符

就是上面提到的readLine()要換行符才知道傳送完成,所以這個只能是服務器端發(fā)送數(shù)據(jù)給客戶端時,結尾一定要加個\r\n

又或者使用 println() 發(fā)送數(shù)據(jù)

如果服務器客戶端都是你維護,那這個解決方案最簡單高效。

以下代碼當個參考,m_clientSocket 即是服務端通信用Socket,非連接用的ServerSocket

 public void SendMessage(String msg) {
     new Thread(new Runnable() {
         @Override
         public void run() {
             try {
                 if (m_clientSocket.isConnected()) {
                     if (!m_clientSocket.isOutputShutdown()) {
                         PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(m_clientSocket.getOutputStream()), true);
                         printWriter.println(msg);
                     }
                 }
             } catch (IOException e) {
                 log(e.getMessage());
             }
         }
     }).start();
 }

解決方案二 使用Read() 方法

這里記得新開線程或用異步任務執(zhí)行接收數(shù)據(jù)的邏輯

private void WaitForData() {
    FutureTask<Void> futureTask = new FutureTask<>(new Callable<Void>() {
        @Override
        public Void call() throws Exception {
            try {
                String charset = "GBK";
                byte[] buffer = new byte[10240];
                String msg;
                int len;
                InputStream inputStream = m_clientSocket.getInputStream();
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, charset));
                while (true) {
                    if (!m_clientSocket.isInputShutdown()) {
                        len = inputStream.read(buffer);
                        if (len == -1) break;
                        msg = new String(buffer, 0, len, charset);
                        log(msg);
                        // 拿到了接收到的數(shù)據(jù)msg后面就是自己的處理邏輯了,是打印還是其他了
                    }
                }
            } catch (Exception e) {
                log(e.getMessage());
            }
            return null;
        }
    });
    new Thread(futureTask).start();
}

解決方案三 DataInputStream

這種方法好是好,但沒有阻塞等待,會一直循環(huán)。(突然發(fā)現(xiàn)阻塞也是好東西呀)

一并貼出來供參考吧,看需要的朋友使用

private void WaitForData() {
    FutureTask<Void> futureTask = new FutureTask<>(new Callable<Void>() {
        @Override
        public Void call() throws Exception {
            int i = 0;
            while (true) {
                if (!client.isInputShutdown()) {
                    try {
                        DataInputStream inputStream = new DataInputStream(client.getInputStream());
                        byte[] buffer = new byte[inputStream.available()];
                        if(buffer.length != 0){
                            inputStream.read(buffer);
                            String msg = new String(buffer);
                            clientReceiveData.OnClientReceiveData(msg);
                        }
                        i++;
                        log(String.valueOf(i));
                    } catch (Exception ee) {
                        log(ee.getMessage());
                    }
                }
            }
        }
    });
    new Thread(futureTask).start();
}

總結

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • @ConfigurationProperties遇到的坑及解決

    @ConfigurationProperties遇到的坑及解決

    這篇文章主要介紹了解決@ConfigurationProperties遇到的坑,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • 淺談java內(nèi)存管理與內(nèi)存溢出異常

    淺談java內(nèi)存管理與內(nèi)存溢出異常

    下面小編就為大家?guī)硪黄獪\談java內(nèi)存管理與內(nèi)存溢出異常。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • Java讀取OpenSSL生成的PEM公鑰文件操作

    Java讀取OpenSSL生成的PEM公鑰文件操作

    這篇文章主要介紹了Java讀取OpenSSL生成的PEM公鑰文件操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • 詳解Java異常處理中finally子句的運用

    詳解Java異常處理中finally子句的運用

    這篇文章主要介紹了Java異常處理中finally子句的運用,是Java入門學習中的基礎知識,需要的朋友可以參考下
    2015-09-09
  • idea沒法識別springboot項目的原因解決及辦法

    idea沒法識別springboot項目的原因解決及辦法

    IDEA無法識別Spring Boot項目可能是由于Lombok依賴未正確解析所致,原pom.xml中未指定Lombok版本號,導致依賴下載失敗,下面就來詳細的介紹一下解決方法,感興趣的可以了解一下
    2025-09-09
  • 使用Feign調(diào)用注解組件(實現(xiàn)字段賦值功能)

    使用Feign調(diào)用注解組件(實現(xiàn)字段賦值功能)

    這篇文章主要介紹了使用Feign調(diào)用注解組件(實現(xiàn)字段賦值功能),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • 淺析springboot通過面向接口編程對控制反轉(zhuǎn)IOC的理解

    淺析springboot通過面向接口編程對控制反轉(zhuǎn)IOC的理解

    這篇文章主要介紹了springboot通過面向接口編程對控制反轉(zhuǎn)IOC的理解,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2020-08-08
  • mybatis-plus使用generator實現(xiàn)逆向工程

    mybatis-plus使用generator實現(xiàn)逆向工程

    mybatis-plus-generator在3.5.0以及以后的版本使用新的方式逆向生成代碼,本文主要介紹了mybatis-plus使用generator實現(xiàn)逆向工程,具有一定的參考價值,感興趣的可以了解一下
    2022-05-05
  • SpringBoot中獲取真實客戶端IP的終極方案

    SpringBoot中獲取真實客戶端IP的終極方案

    在日常開發(fā)中,獲取客戶端IP看似簡單,實則暗藏玄機,今天,小編將徹底揭秘Spring Boot中獲取真實客戶端IP的正確姿勢,讓你避開所有的坑
    2026-01-01
  • Java異常處理實例教程

    Java異常處理實例教程

    這篇文章主要為大家分享一份非常詳細的Java異常處理實例教程,幫助大家更好的學習java異常處理,感興趣的小伙伴們可以參考一下
    2016-02-02

最新評論

富宁县| 武隆县| 历史| 治县。| 乌鲁木齐县| 大理市| 顺昌县| 永登县| 阳东县| 涞水县| 图木舒克市| 保德县| 甘孜| 腾冲县| 铁岭市| 朝阳县| 新绛县| 巴林右旗| 开鲁县| 宁南县| 涿鹿县| 桑日县| 宿州市| 嘉义市| 泸西县| 伊金霍洛旗| 沂水县| 新源县| 汶上县| 元谋县| 酒泉市| 淮北市| 桦南县| 长白| 黔东| 乐都县| 濮阳县| 安溪县| 湘阴县| 杭州市| 南和县|