天天看點

Java Socket 循環接收資料readLine()阻塞問題解決辦法寫在前面解決方案一 加換行符解決方案二 使用Read() 方法解決方案三 DataInputStream

鍐欏湪鍓嶉潰

鍙兘璇村熀纭€涓嶇墷鍚э紝浠g爜閫昏緫涓€鍒嘜K锛屽氨鏄帴鏀朵笉鍒版湇鍔″櫒淇℃伅锛屽彂閫佹病闂銆? 鍥犱負鏈嶅姟鍣ㄤ笉鏄垜鑳芥帶鍒剁殑锛屽彧鑳藉湪瀹㈡埛绔兂鍔炴硶瑙e喅锛屽悗鏉ユ柇鐐圭煡閬撲簡

readLine()

闃誨鐨勬儏鍐碉紝澶ф棤璇憖锛岄樆濉炲ソ鏄ソ锛屼絾浣犺鎹㈣绗︼紝鎴戝摢鐭ラ亾鏈嶅姟鍣ㄧ粰鐨勬槸浠€涔堛€?

杩欓噷socket鐨勮繛鎺ヤ箣绫葷殑浠g爜寰堝锛屽氨涓嶉噸澶嶈創浜嗭紝鍙斁浜涜В鍐蟲柟妗堜緵鏈夊悓鏍烽棶棰樼殑鏈嬪弸鍙傝€?

瑙e喅鏂規涓€ 鍔犳崲琛岀

灏辨槸涓婇潰鎻愬埌鐨?code>readLine()瑕佹崲琛岀鎵嶇煡閬撲紶閫佸畬鎴愶紝鎵€浠ヨ繖涓彧鑳芥槸鏈嶅姟鍣ㄧ鍙戦€佹暟鎹粰瀹㈡埛绔椂锛岀粨灏句竴瀹氳鍔犱釜

\r

鎴?code>\n

鍙堟垨鑰呬嬌鐢?

println()

鍙戦€佹暟鎹? 濡傛灉鏈嶅姟鍣ㄥ鎴風閮芥槸浣犵淮鎶わ紝閭h繖涓В鍐蟲柟妗堟渶绠€鍗曢珮鏁堛€?

浠ヤ笅浠g爜褰撲釜鍙傝€冿紝m_clientSocket 鍗蟲槸鏈嶅姟绔€氫俊鐢⊿ocket锛岄潪杩炴帴鐢ㄧ殑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();
 }
           

瑙e喅鏂規浜?浣跨敤Read() 鏂規硶

杩欓噷璁闆緱鏂闆紑绾跨▼鎴栫敤寮傛浠誨姟鎵ц鎺ユ敹鏁版嵁鐨勯€昏緫

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);
                        // 鎷垮埌浜嗘帴鏀跺埌鐨勬暟鎹甿sg鍚庨潰灏辨槸鑷繁鐨勫鐞嗛€昏緫浜嗭紝鏄墦鍗拌繕鏄叾浠栦簡
                    }
                }
            } catch (Exception e) {
                log(e.getMessage());
            }
            return null;
        }
    });
    new Thread(futureTask).start();
}
           

瑙e喅鏂規涓?DataInputStream

杩欑鏂規硶濂芥槸濂斤紝浣嗘病鏈夐樆濉炵瓑寰咃紝浼氫竴鐩村驚鐜€傦紙绐佺劧鍙戠幇闃誨涔熸槸濂戒笢瑗垮憖锛? 涓€骞惰創鍑烘潵渚涘弬鑰冨惂锛岀湅闇€瑕佺殑鏈嬪弸浣跨敤

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();
}