Reputation: 6517
I'm trying to write my first socket server so I decided to start with something very simple be fore that just to figure the flow :) I'm writing a simple java echo server, but the thing is that (for some reason?!) I'm not getting the server response in the client, althought the request is received in the server.
package poc.client;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
public class Client {
public static void main(String[] args) {
try {
final Socket socket = new Socket((String) null, 50000);
final BufferedReader reader = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
final PrintWriter writer = new PrintWriter(
socket.getOutputStream(), true);
writer.println("ala bala\r\n");
writer.flush();
writer.close();
System.out.println(reader.readLine());
System.out.flush();
} catch (Exception ex) {
Logger.getAnonymouseLogger().throwing(TAG, "main", ex);
}
}
}
And the server part is
package poc.server;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
/**
* debugging purposes only
*/
@SuppressWarnings("unused")
private static final String TAG = Server.class.getSimpleName();
public static void main(String[] args) {
try {
final ServerSocket socket = new ServerSocket(50000);
while (true) {
final Socket clientSocket = socket.accept();
final BufferedReader reader = new BufferedReader(
new InputStreamReader(clientSocket.getInputStream()));
final PrintWriter writer = new PrintWriter(clientSocket
.getOutputStream(), true);
writer.println(reader.readLine());
writer.flush();
writer.close();
}
} catch (IOException e) {
Logger.getAnonymouseLogger().throwins(TAG, "main",ex);
}
}
}
I read all the Oracle basic socket tutorials/etc but I just can't figure what's wrong - I'm successfully writing to the server socket but I seem to be unable to get the response.
Upvotes: 4
Views: 2744
Reputation: 17923
Do not close the writer before reading from the socket. Following code works
final Socket socket = new Socket((String) null, 50000);
final BufferedReader reader = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
final PrintWriter writer = new PrintWriter(
socket.getOutputStream(), true);
writer.println("ala bala\r\n");
System.out.println(reader.readLine());
//writer.flush();
writer.close();
As per the javadoc of close() method:
Closes the stream and releases any system resources associated with it. Closing a previously closed stream has no effect.
Looks like if you close the stream, the underlying socket also gets closed. You can verify this by printing the stack trace in your current code. It gives java.net.SocketException: socket closed
error.
Upvotes: 2
Reputation: 117627
Try this instead:
Socket socket = new Socket(InetAddress.getLocalHost(), 50000);
Also note that, there is no need for writer.flush();
since you are making it an auto-flush stream when you pass true
to the second parameter of the PrintWriter
constructor.
Upvotes: 0