Shlomi Shlomi - 4 months ago 18
Java Question

Java socket - Read & Write

I have no idea why the client doesn't seem to read anything from socket.

Here is my server:

Socket client1 = accept();
PrintWriter writer = new PrintWriter(client1.getOutputStream());
writer.write("Hello user 1");


Here is my client :

BufferedReader in = new BufferedReader(new InputStreamReader(getInputStream()));

while(true) {
String line = in.readLine();
System.out.println("Text received: " + line);
}


The problem:
Client doesn't receive any message.

EDIT:

Here is the full code for both client and server:

CLIENT

public class Client extends Socket{


public Client(String hostName, int port) throws UnknownHostException, IOException {
super(hostName,port);

BufferedReader in = new BufferedReader(new InputStreamReader(getInputStream()));

while(true) {
String line = in.readLine();
System.out.println("Text received: " + line);
}

}


SERVER

public final class Server extends ServerSocket{

public Server(int port) throws IOException {
super(port);

System.out.println("Server waiting for client 1");
Socket client1 = accept();
PrintWriter writer = new PrintWriter(client1.getOutputStream(), true);
writer.write("Hello user 1");

System.out.println("Server waiting for client 2");
Socket client2 = accept();
PrintWriter writer2 = new PrintWriter(client2.getOutputStream(), true);
writer2.write("Hello user 2");

System.out.println("Clients connected");

}



  • I start the server to listen to port 4444

  • I start the clients with hostname of "localhost" and port 4444


Answer

You have to include a newline character at the end of the message, and also flush the PrintWriter if the connection is not immediately altered, forcing an automatic flush:

writer.write("Hello user 1\n");
writer.flush();

EDIT:

It is possible to enable automatic flushing on a PrintWriter using the constructor new PrintWriter(someOutputStream, true)

However, as explained in the documentation:

if automatic flushing is enabled it will be done only when one of the println, printf, or format methods is invoked, rather than whenever a newline character happens to be output

This means that even with automatic flushing, the PrintWriter would still have to be manually flushed after write is called, and a newline character (\n) would still have to be included at the end of the string.

EDIT 2:

Here is a small example of a fully functional client/server application:

Client:

public static void main(String[] args){
    try{
        Socket socket = new Socket(HOST_ADDRESS, PORT);
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        System.out.println(bufferedReader.readLine());
        bufferedReader.close();
        socket.close();
    }catch(IOException e){}
}

Server:

public static void main(String[] args){
    try{
        ServerSocket serverSocket = new ServerSocket(PORT);
        Socket socket = serverSocket.accept();
        PrintWriter printWriter = new PrintWriter(socket.getOutputStream());
        printWriter.write("Hello user!\n");
        printWriter.flush();
        printWriter.close();
        socket.close();
        serverSocket.close();
    }catch(IOException e){}
}