سؤال

public class Main {

    public static void main(String[] args) {
        Server server = new Server(9008);
    }
}

public class Server {

    private ServerSocket server;
    private Socket client;

    public Server(int port) {
        try {
            // Create out server with our desired port
            server = new ServerSocket(port);
            // Server started, let the user know
            System.out.println("Server started at port " + port + "...");
        } catch (IOException e) {
            // Unable to start server, print error
            System.out.println("Unable to start server on port " + port + "...");
        } 
        // Start our main server method
        runServer();
    }

    public void runServer() {
        while (true) {
            try {
                // Wait for new clients and accept them
                client = server.accept();
                // Let the user know - print
                System.out.println("New user connected - " + client.getLocalAddress().getHostAddress());
                // Start thread for our client
                Thread clientThread = new Thread(new ClientConnection(client));
                clientThread.start();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

So at this points everything is going fine, now inside my clientThread the problem starts

    public class ClientConnection implements Runnable {

    private Socket socket;

    public ClientConnection(Socket client) {
        // Set client socket
        this.socket = client;
    }

    public void run() {
        try {
            // Read from our client input
            BufferedReader readClient = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String line;
            while ((line = readClient.readLine()) != null) {
                System.out.println("Client says - " + readClient.readLine());
            }
        } catch(IOException e) {

        }
    }
}

Is there a better way to handle this?

My actual client

public class Main {

    public static void main(String args[]) {

        try {
            Socket socket = new Socket("localhost", 9008);
            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
            writer.write("Hello\n");
            writer.flush();
            socket.close();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

I will get "Client says - null" displayed

هل كانت مفيدة؟

المحلول

UPDATE: The way to read in an InputStream/Reader is somethink like

while ((myString = readClient.readLine()) != null) {
   System.out.println(myString);
}

this way the loop will exit when the connection is closed.

Also, move the try/catch outside the loop, or do some error control. If you get an exception, you do not want to just try get again in the loop.

UPDATE2: In case my comment was not clear enough, over your updated code do

        String line;
        while ((line = readClient.readLine()) != null) {
            System.out.println("Client says - " + line);
        }

Just one read per iteration, at the while, so the loop can exit if line is null (that means the connection has been closed).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top