[英]Read data in Java from C++ socket
我寫了這個程序,但是沒有達到line b
。 我確定循環已經完成。 有人知道哪里出問題了嗎? :D謝謝
while((x = inr.read(chars, 0, chars.length)) != -1){
result += String.valueOf(chars[0]);
Log.d("@@@", "a " + result); // line a
};
Log.d("@@@", "a " + result); // line b
產量
05-31 10:18:20.249: D/@@@(676): Starting iMNSConnection...
05-31 10:18:20.249: D/@@@(676): Is trying to connect to server...
05-31 10:18:20.289: D/@@@(676): a W
05-31 10:18:20.289: D/@@@(676): a We
05-31 10:18:20.289: D/@@@(676): a Wel
05-31 10:18:20.289: D/@@@(676): a Welc
05-31 10:18:20.289: D/@@@(676): a Welco
05-31 10:18:20.294: D/@@@(676): a Welcom
05-31 10:18:20.294: D/@@@(676): a Welcome
05-31 10:18:20.294: D/@@@(676): a Welcome
05-31 10:18:20.294: D/@@@(676): a Welcome !
05-31 10:18:20.294: D/@@@(676): a Welcome !!
05-31 10:18:20.294: D/@@@(676): a Welcome !!!
05-31 10:18:20.299: D/dalvikvm(676): GC_CONCURRENT freed 1196K, 36% free 16727K/25991K, paused 1ms+2ms, total 15ms
05-31 10:18:20.299: D/dalvikvm(676): WAIT_FOR_CONCURRENT_GC blocked 13ms
編輯
實際上,我正在使用帶有Java客戶端的C ++服務器
C ++方面
char* classroomList = "{........}";
send(ConnectedSocket, classroomList, strlen(classrooomList), 0);
然后客戶端silde(Java)如果我使用BufferedReader並什么也不打印。 所以我用這個
InputStreamReader inr = new InputStreamReader(ins);
char[] chars = new char[1024];
while((x = inr.read(chars, 0, chars.length - 1)) != -1){
result += String.valueOf(chars);
}
輸出是這樣的:
05-31 10:47:32.464: D/@@@(14850): Is trying to connect to server...
05-31 10:47:32.494: D/@@@(14850): 11a Welcome !!!������...(and 2028 same characters)
所以我嘗試添加
while((x = inr.read(chars, 0, chars.length - 1)) != -1){
chars[x] = '\0';
result += String.valueOf(chars);
Log.d("@@@", x + "a " + result);
}
當Java將數據結束到C ++服務器時,這一功能就起作用了。 我在C ++上執行此操作,但在Java上不起作用
最后我嘗試一下
while((x = inr.read(chars, 0, chars.length - 1)) != -1){
chars[x] = '\0';
result += String.valueOf(chars);
Log.d("@@@", x + "a " + result);
}
或使用StringBuilder也不起作用。
遵循SM工作之后,
Log.d("@@@", "Waiting for server reply...");
InputStream in = socket.getInputStream();
InputStreamReader inr = new InputStreamReader(in);
BufferedReader br = new BufferedReader(inr);
StringBuilder sb = new StringBuilder();
String line;
while ((line = br.readLine()) != null) {
Log.d("@@@", ": " + line);
sb.append(line);
}
br.close();
Log.d("@@@", ": " + sb.toString());
輸出未通過while循環
05-31 11:04:37.734: D/dalvikvm(22624): GC_FOR_ALLOC freed 1621K, 39% free 15950K/25991K, paused 18ms, total 18ms
05-31 11:04:37.749: D/@@@(22624): Starting iMNSConnection...
05-31 11:04:37.749: D/@@@(22624): Is trying to connect to server...
05-31 11:04:37.759: D/@@@(22624): Waiting for server reply...
05-31 11:04:37.789: D/dalvikvm(22624): GC_CONCURRENT freed 1194K, 36% free 16744K/25991K, paused 1ms+1ms, total 13ms
05-31 11:04:37.789: D/dalvikvm(22624): WAIT_FOR_CONCURRENT_GC blocked 12ms
05-31 11:04:37.809: D/AbsListView(22624): Get MotionRecognitionManager
05-31 11:04:37.819: D/SensorManager(22624): unregisterListener:: Listener= android.view.OrientationEventListener$SensorEventListenerImpl@41d85420
05-31 11:04:37.819: D/Sensors(22624): Remain listener = Sending .. normal delay 200ms
05-31 11:04:37.819: I/Sensors(22624): sendDelay --- 200000000
05-31 11:04:37.819: D/SensorManager(22624): JNI - sendDelay
05-31 11:04:37.819: I/SensorManager(22624): Set normal delay = true
05-31 11:05:41.944: D/dalvikvm(22624): GC_CONCURRENT freed 1078K, 33% free 17590K/25991K, paused 21ms+20ms, total 82ms
誰產生文本Welcome !!!
? 也許另一側沒有關閉流。
無論如何,您的代碼都是無效的。 您正在創建許多String對象,每個字符讀取一次。 如果要從流中讀取文本,則最好使用類似以下的內容:
BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
StringBuilder sb = new StringBuilder();
String line;
while ((line = br.readLine()) != null) {
sb.append(line);
}
br.close(); // and catch exception
Java字符串不是以Null結尾的。 如果將x
個字節接收到byte[]
緩沖buffer
,則從中構造字符串的正確方法是new String(buffer, 0, x)
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.