Skip to main content

inputStream data lost



I am doing simple client-server in Java. This is my client code.







try {

socket = new Socket(serverIP, serverport);

dataStream = new DataOutputStream(new BufferedOutputStream(

socket.getOutputStream()));

long[] data = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };

for (int i = 0; i < data.length; i++) {

dataStream.writeLong(data[i]);

System.out.println("So far" + dataStream.size());

}

}

} catch (IOException e) {

e.printStackTrace();

} finally {

if (socket != null)

try {

socket.close();

dataStream.close();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}







This works fine because I can see that a mount of bytes have been written to the server. Here goes the server code.







try {

ServerSocket newSocket = new ServerSocket(2503);

while (true) {

connectionSocket = newSocket.accept();

input = new DataInputStream(new BufferedInputStream(connectionSocket.getInputStream()));

System.out.println(input.readLong());

}







However, none of data is successfully read from the server socket, the connectionSocket.getInputStream.available() returns 0 bytes. let's assume every variables were declared properly. Any idea why? Appreciate the help.


Comments

  1. Your loop is calling accept at each pass which will block until the next client attaches. So the first client attaches, it reads a long, prints that, then loops around blocking waiting for another connection to attach. You need to move that outside the loop. Probably in a separate thread because if you iterate over the stream on the same thread as the accept new clients cannot connect until it finishes with the first client. That's the next step, but here is how you fix your problem:

    try {
    ServerSocket newSocket = new ServerSocket(2503);
    while( !done ) {
    Socket nextClient = newSocket.accept();
    // it's better to start a thread and put the call to this method in there
    // so the thread owning the ServerSocket can loop back around and accept
    // another client should another connect while it's servicing this client
    handleNewClient( nextClient );
    }
    } finally {
    newSocket.close();
    }

    public void handleNewClient( Socket client ) {
    boolean done = false;
    DataInputStream in = new DataInputStream( new BufferedInputStream( client.getInputStream() ) );
    while( !done ) {
    try {
    Long l = in.readLong();
    System.out.println( l );
    } catch( EOFException e ) {
    // this is not a great way to end the conversation from a client.
    // better to either know how much you can read the stream (ie count of bytes),
    // or use a termination encoding. Otherwise you have to wait till the client
    // closes their side which throws EOFException.
    done = true;
    }
    }
    }

    ReplyDelete
  2. Flush/close the stream before closing the socket.

    [Was: flush/close the stream, before code was updated]

    ReplyDelete

Post a Comment

Popular posts from this blog

Slow Android emulator

I have a 2.67 GHz Celeron processor, 1.21 GB of RAM on a x86 Windows XP Professional machine. My understanding is that the Android emulator should start fairly quickly on such a machine, but for me it does not. I have followed all instructions in setting up the IDE, SDKs, JDKs and such and have had some success in staring the emulator quickly but is very particulary. How can I, if possible, fix this problem?

CCNA 3 Final Exam => latest version

1 . Which security protocol or measure would provide the greatest protection for a wireless LAN? WPA2 cloaking SSIDs shared WEP key MAC address filtering   2 . Refer to the exhibit. All trunk links are operational and all VLANs are allowed on all trunk links. An ARP request is sent by computer 5. Which device or devices will receive this message? only computer 4 computer 3 and RTR-A computer 4 and RTR-A computer 1, computer 2, computer 4, and RTR-A computer 1, computer 2, computer 3, computer 4, and RTR-A all of the computers and the router   3 . Refer to the exhibit. Hosts A and B, connected to hub HB1, attempt to transmit a frame at the same time but a collision occurs. Which hosts will receive the collision jamming signal? only hosts A and B only hosts A, B, and C only hosts A, B, C, and D only hosts A, B, C, and E   4 . Refer to the exhibit. Router RA receives a packet with a source address of 192.168.1.65 and a destination address of 192.168.1.161...