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.
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:
ReplyDeletetry {
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;
}
}
}
Flush/close the stream before closing the socket.
ReplyDelete[Was: flush/close the stream, before code was updated]