简体   繁体   中英

Read data in Java from C++ socket

I wrote this program, but it never reaches line b . I am sure the loop is completing. Does anyone know what is wrong? :D thanks

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

Output

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

Edited

Actuall I am using a C++ Server with Java client

C++ side

char* classroomList = "{........}";
send(ConnectedSocket, classroomList, strlen(classrooomList), 0);

Then the client silde (Java) If I use BufferedReader and Print out nothing. So I use this,

InputStreamReader inr = new InputStreamReader(ins);
char[] chars = new char[1024];
while((x = inr.read(chars, 0, chars.length - 1)) != -1){
    result += String.valueOf(chars);
}

The Output like this:

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)

So I try to add this

while((x = inr.read(chars, 0, chars.length - 1)) != -1){
    chars[x] = '\0';
    result += String.valueOf(chars);
    Log.d("@@@", x + "a " + result);
}

This one work when Java end data to C++ server. I do this on C++ but not work on Java

Finally I try this,

while((x = inr.read(chars, 0, chars.length - 1)) != -1){
    chars[x] = '\0';
    result += String.valueOf(chars);
    Log.d("@@@", x + "a " + result);
}

Or using StringBuilder dont work too.

After follow SM work,

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

The output dont not pass thr the while loop

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

Who produces the text Welcome !!! ? Maybe the other side doesn't close the stream.

In any case, your code is very ineffective. You are creating many String objects, one per each character read. If you are reading text from stream, you'd better use something like:

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 Strings are not null-terminated. If you receive x bytes into a byte[] buffer buffer , the correct way to construct a String from it is new String(buffer, 0, x) .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM