2012-03-06 58 views
1

我無法獲得Android(客戶端)和c#應用(服務器)之間的套接字連接以正確讀取響應。插槽純文本響應中斷

我已經成功地從android發送一條消息到C#,我正在閱讀它的罰款。但是,當我嘗試向Android發送確認信息時,我不知道處理這種情況的正確方法,而且我不得不在一些教程不清楚的地方做出一些假設。我am在android中獲取響應,但它不是100%正確的。我通過Wireshark驗證過c#發送了我想要發送的內容,並且文本看起來很好,直到它到達android。

C#: 
    public void SendClientMessage() 
    { 
     NetworkStream clientStream = _Client.GetStream(); 
     ASCIIEncoding encoder = new ASCIIEncoding(); 
     byte[] buffer = encoder.GetBytes("Hello Client!"); //Static test message 

     clientStream.Write(buffer, 0, buffer.Length); 
     clientStream.Flush(); 
    } 

...

Android: 
    private void listenResponse() 
    { 
     Log.i(TAG, "listenRespose() Listening..."); 
     try 
     { 
      InputStream is = socket.getInputStream(); 
      BufferedInputStream bis = new BufferedInputStream(is); 
      byte[] buffer = new byte[1024]; 
      int countBytesRead = bis.read(buffer, 0, 8); 
      String response = new String(buffer); 
      Log.i(TAG, "listenResponse() Heard: " + response); 
     } 
     catch (IOException e) 
     { 
      Log.e(TAG, "listenResponse() IOException", e); 
      e.printStackTrace(); 
     } 
     Log.i(TAG, "listenResponse() Done Listening."); 
    } 

...

WireShark shows: 
    Hello Client! 

...

Android LogCat shows: 
    listenRespose() Listening... 
    listenResponse() Heard: Hello Cl??????????????????????????? [... ?s continue for a long time] 
    listenResponse() Done Listening. 

如果不是我初始化這樣我的字符串:

String response = new String(buffer, 0, countBytesRead); 

至少我沒有得到所有的問號,但我仍然沒有得到我應該得到的完整字符串。我初始化我的字節[]錯誤,還是有不同的方式來做到這一點,更適合純文本?

回答

2

你只讀8個字節這裏

int countBytesRead = bis.read(buffer, 0, 8); 
//      max bytes to read^

而是閱讀所有您可以:

int countBytesRead = bis.read(buffer, 0, Buffer.length); 

問號你看到的是因爲你的緩衝區未初始化。

+0

是的!謝謝!我討厭這樣的事情,我只關注字節數組上的1024維度大小。衛生署!非常感謝先生 – maxx233 2012-03-06 10:03:18