asenovm
asenovm

Reputation: 6517

Simple Java echo server issue

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

Answers (2)

Santosh
Santosh

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

Eng.Fouad
Eng.Fouad

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

Related Questions