Java SocketServer is accepting input from a Socket client but the Socket client is not receiving input from the SocketServer

时间:2016-08-31 17:53:01

标签: java sockets network-programming inputstream blocking

I'm trying to learn Java Network Programming but I'm running into some roadblocks. I've written a server and a client already but every time I try to connect them, I instantly get a connection closed error. Then, I tried to edit it but now I get a connection refused error. Giving up on that, I decided to work on a very simple server to test out the basics of Sockets and ServerSockets. Doing so, I've come up with these two classes:

import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.io.*;

public class SimpleServer {
    public static void main(String[] args) throws Exception {
        System.out.println("hey there");
        ServerSocket server = new ServerSocket(50010);
        Socket socket = server.accept();
        System.out.println("Connection at " + socket);

        InputStream in = socket.getInputStream();
        int c = 0;
        while ((c = in.read()) != -1) {
            System.out.print((char)c);
        }


        OutputStream out = socket.getOutputStream();
        for (byte b : (new String("Thanks for connecting!")).getBytes()) {
            out.write(b);
            out.flush();
        }

        in.close();
        out.close();
        socket.close();
        server.close();
    }
}

and

import java.net.Socket;
import java.io.*;

public class SimpleClient {
    public static void main(String[] args) throws Exception {
        System.out.println("Attempting connection");
        Socket s = new Socket("130.49.89.208", 50010);
        System.out.println("Cool");

        OutputStream out = s.getOutputStream();
        for (byte b : (new String("Hey server\r\nThis message is from the client\r\nEnd of message\r\n")).getBytes()) {
            out.write(b);
            out.flush();
        }

        InputStream in = s.getInputStream();
        int c = 0;
        System.out.println("this message will print");
        while ((c = in.read()) != -1) {
            System.out.print((char)c);
            System.out.println("this does not print");
        }

        out.close();
        in.close();
        s.close();
    }
}

The server receives the client's message perfectly fine, but then when it is the server's turn to write to the client, everything just blocks.

Server's output:

-java SimpleServer 
----hey there 
----Connection at Socket[addr=/130.49.89.208,port=59136,localport=50010]
----Hey server
----This message is from the client
----End of message

Client's Output:

-java SimpleClient
----Attempting connection
----Cool
----this message will print

The client and the server both run on my laptop on an ethernet connection to a university's internet connection, if that helps.

2 个答案:

答案 0 :(得分:1)

According to the Javadocs, the InputStream.read() is described as:

If no byte is available because the end of the stream has been reached, the value -1 is returned. This method blocks until input data is available, the end of the stream is detected, or an exception is thrown.

In your case, the only possibility to break the while-loop is when the client closes the connection, thereby resulting in end-of-stream.

This is expected as per what you've coded!

答案 1 :(得分:0)

Your server code is getting stuck here and thus never writing back to the client

   while ((c = in.read()) != -1) {
        System.out.print((char)c);
    }