2016-08-24 2 views
0

원격 Tcp 서버 장치는 한 번에 8 바이트의 데이터를 보내고 비교적 빠른 속도로 데이터를 전송합니다 (그러나 끔찍한 속도는 아닙니다). 어쨌든, 나는 8 바이트를 받고 주어진 8 바이트를 제정하고 싶다. 그러나, 내 count (코드에서) 8 바이트의 여러 배수, 길이가 16에서 120 + 바이트 다양한 위치를 다시 8 바이트 배수가있는 bytearrays받는 것으로 보입니다.tcp socket에서 하나의 패킷 만 빠르게받는 방법

Wireshark를 확인하면 원격 Tcp 서버가 8 바이트를 올바르게 보내고 결합하지 않은 것 같습니다. 이것은 소켓의 읽기가 너무 느려서 내가 원하지 않는 나에게 8 바이트 간격을 되풀이하는 것을 보여준다. 예 :

8bytes-8bytes-16bytes-8bytes-8bytes-56bytes.

여기에 데이터 스트림의 시간 소인이 10ms 정도입니다. 8 개 바이트의 데이터의 어떤 배수가 없는지 확인하면서

(13:44:23.210) 00h 10h 01h 06h FFh 3Ah FFh FFh 
(13:44:23.290) 00h 10h 01h 06h FFh 3Fh FFh FFh 
(13:44:23.300) 00h 10h 01h 06h FFh 44h FFh FFh 

방법 제가

효율적으로 가능한 한 빠르게되도록 포트로부터 판독 하는가?

아래 코드는 알 수없는 크기의 데이터를 읽고 추가 처리를 위해 다시 NetworkManager에 게시하는 세그먼트입니다. 원하는 효과를 얻으려는 목적으로 다른 스트림을 사용해 보았지만 스트림을 보장하지 않았습니다.

private class Receive extends Thread { 

     private InputStream inputStream; 
     private DataInputStream dataInputStream; 
     private BufferedInputStream bufferedInputStream; 
     private ByteArrayOutputStream byteArrayOutputStream; 

     public void run() { 
      if (DEBUG) Log.d(TAG + " \"" + name + "\"", String.valueOf(getId()) + ":receive run."); 
      bundle = new Bundle(); 
      buffer = new byte[1024]; 
      try { 
       bufferedInputStream = new BufferedInputStream(socket.getInputStream()); 
      } catch (IOException ioException) { 
       Log.d(TAG + " \"" + name + "\"", String.valueOf(getId()) + ":IOException", ioException); 
      } 
      while (connected && !closed) { 
       if (DEBUG) Log.d(TAG + " \"" + name + "\"", String.valueOf(getId()) + ":retry read."); 
       try { 
//     socket.setSoTimeout(timeout); 
        int count = bufferedInputStream.read(buffer); 
        byteArrayOutputStream = new ByteArrayOutputStream(count); 
        if (count == -1) { 
         networkManager.stopTcpNetwork(name); 
         closed = true; 
         Log.d(TAG + " \"" + name + "\"", String.valueOf(getId()) + "Connection Lost?!?!"); 
        } else { 
         if (DEBUG) Log.d(TAG + " \"" + name + "\"", String.valueOf(getId()) + ":call back." + " Count: " + String.valueOf(count)); 
         byteArrayOutputStream.write(buffer, 0, count); 
         bundle.putByteArray(name, byteArrayOutputStream.toByteArray()); 
//      bundle.putByteArray(name, buffer); 
         message = networkManager.obtainMessage(); 
         message.what = Messages.MESSAGES_TCP_DATA.getInt(); 
         message.setData(bundle); 
         networkManager.sendMessage(message); 
        } 
       } catch (SocketTimeoutException socketTimeoutException) { 
        if (DEBUG) Log.d(TAG + " \"" + name + "\"", String.valueOf(getId()) + ":no data yet."); 
       } catch (Exception exception) { 
        Log.d(TAG + " \"" + name + "\"", String.valueOf(getId()) + ":Exception", exception); 
       } 
      } 
     } 
    } 
+2

'buffer = new byte [8];'? – greenapps

+0

@greenapps가 읽기 작업을 효과적으로 가속화합니까? –

+1

왜 그렇게 생각하니? 그리고 왜 물어 보죠? – greenapps

답변

-1

소켓은 데이터를 버퍼에 읽기 전에 버퍼링합니다. 다른 사람들이 지적했듯이 올바른 대답은 소켓에서 모든 것을 읽거나 소켓에서 예상되는 바이트 수만 읽는 것입니다.

어쨌든 프로젝트가 성장하고 끌어 오기에 필요한 데이터도 늘어났습니다. 즉, 가장 쉬운 방법은 다른 스레드로 데이터를 다시 보내 로컬로 버퍼링 한 다음 잠재적 인 메시지 (완료로 확인 됨)를 처리하고 이후에 처리하도록하는 것입니다.

다른 사람에게 도움이되기를 바랍니다. 그렇지 않다면, 죄송합니다. 의견을 보내 주신 모든 분들께 감사드립니다.

+0

'가장 직접적인 답변'은 2016 년 8 월 24 일 20:07의 댓글에 게시되었으며 실제로 질문에 답변하는 것은 없습니다. – EJP