1

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

2 Answers 2

1

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
Sign up to request clarification or add additional context in comments.

11 Comments

The Server side is a server written in C++, I can use bufferedReader to read the socket. Cant read anything.
I agree with @sm4. It seems like the client isn't closing the socket. You might be able to test this using telnet by issuing the command 'telnet <your_ip> <app_port>', typing some stuff, then hitting Ctrl-] to end.
So you have control over the C++ output? Try sending some new lines and see if anything gets read by the bufferred reader. I think the problem might be server side. But definitely don't use String concatenation in a loop :)
@sm4 I update the data, I post the C++ code too. See if you can help me :D Thank!!!
That's because Bufferred reader will read bytes while waiting for a new line character or end of stream character before it creates any output. This is not a bug, the bug is in your server.
|
0

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).

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.