Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 一个应用程序中的服务器和服务器套接字:不工作_Java_Sockets_Client_Serversocket - Fatal编程技术网

Java 一个应用程序中的服务器和服务器套接字:不工作

Java 一个应用程序中的服务器和服务器套接字:不工作,java,sockets,client,serversocket,Java,Sockets,Client,Serversocket,我正在尝试编写一个小程序,它打开一个服务器,创建一个连接到此服务器并从中接收消息的客户端 这是到目前为止的代码 public static void main(String[] args) { final ServerSocket serverSocket; try { serverSocket = new ServerSocket(12345); Thread t = new Thread(){ public void run(){

我正在尝试编写一个小程序,它打开一个服务器,创建一个连接到此服务器并从中接收消息的客户端

这是到目前为止的代码

public static void main(String[] args) {
final ServerSocket serverSocket;
try {
    serverSocket = new ServerSocket(12345);
    Thread t = new Thread(){
        public void run(){
                try {
                    Socket server = serverSocket.accept();
                    PrintWriter writer = new PrintWriter(server.getOutputStream(), true);
                    writer.write("Hello World");
                    writer.flush();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        };
        t.start();
        Socket client = new Socket("localhost", 12345);
        BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream()));
        String message = reader.readLine();

        System.out.println("Received " + message);
    } catch (IOException e1) {
        e1.printStackTrace();
    }

}
如果我运行程序,它会一直在readLine()中等待-因此客户端显然不会从服务器接收消息。
有人知道为什么这不起作用吗?

您的阅读线程正在等待数据流中的换行符。只需将服务器更改为使用:

writer.write("Hello World\r\n");

你会得到你期待的结果。或者,您可以关闭服务器套接字,然后当它到达数据流的末尾时,
readLine
将返回。

您的读取线程正在等待数据流中的换行符。只需将服务器更改为使用:

writer.write("Hello World\r\n");

你会得到你期待的结果。或者,您可以只关闭服务器套接字,然后当它到达数据流的末尾时,
readLine
将返回。

您应该将readLine放入一个循环中,如下所示:

public static void main(String[] args) {
    final ServerSocket serverSocket;
    try {
        serverSocket = new ServerSocket(12345);
        Thread t = new Thread() {
            public void run() {
                try {
                    Socket server = serverSocket.accept();
                    PrintWriter writer = new PrintWriter(server.getOutputStream(), true);
                    writer.write("Hello World");
                    writer.flush();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        };
        t.start();
        Socket client = new Socket("localhost", 12345);
        BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream()));
            // Check this --------------------------------------------------->
            String message = null;
            while ((message = in.readLine()) != null) {   
                    System.out.println("Received " + message);
                    break; //This break will exit the loop when the first message is sent by the server
            }

    } catch (IOException e1) {
        e1.printStackTrace();
    }

}

您可以阅读此文档以获得进一步的解释:

您应该按如下方式将读线放入循环中:

public static void main(String[] args) {
    final ServerSocket serverSocket;
    try {
        serverSocket = new ServerSocket(12345);
        Thread t = new Thread() {
            public void run() {
                try {
                    Socket server = serverSocket.accept();
                    PrintWriter writer = new PrintWriter(server.getOutputStream(), true);
                    writer.write("Hello World");
                    writer.flush();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        };
        t.start();
        Socket client = new Socket("localhost", 12345);
        BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream()));
            // Check this --------------------------------------------------->
            String message = null;
            while ((message = in.readLine()) != null) {   
                    System.out.println("Received " + message);
                    break; //This break will exit the loop when the first message is sent by the server
            }

    } catch (IOException e1) {
        e1.printStackTrace();
    }

}

您可以阅读此文档以获得进一步的解释:

Better:change
writer.write(“Hello World”)
writer.println(“你好世界”)@RyanStewart:可能。我个人更喜欢减少代码对平台默认值的依赖性——当涉及到网络协议时,不管服务器是运行Windows还是某种风格的Unix。是的,尽管我怀疑您的选择在Mac上不太合适。如果我们担心产品的价值,那么答案就是出于这些确切的原因不要使用
reader.readLine()
。不过,这是一个完全不同的方向。@RyanStewart:它应该做-
BufferedReader.readLine
故意处理
\n
\r\n
\r
我相信。(刚刚选中:“读取一行文本。行被视为由换行符('\n')、回车符('\r')或紧接着换行符的回车符中的任何一个终止。”)。我没有意识到。更好:改变
writer.write(“你好世界”)
writer.println(“你好世界”)@RyanStewart:可能。我个人更喜欢减少代码对平台默认值的依赖性——当涉及到网络协议时,不管服务器是运行Windows还是某种风格的Unix。是的,尽管我怀疑您的选择在Mac上不太合适。如果我们担心产品的价值,那么答案就是出于这些确切的原因不要使用
reader.readLine()
。不过,这是一个完全不同的方向。@RyanStewart:它应该做-
BufferedReader.readLine
故意处理
\n
\r\n
\r
我相信。(刚刚选中:“读取一行文本。行被视为由换行符('\n')、回车符('\r')或紧接着换行符的回车符中的任何一个终止。”)。我没有意识到。这根本不解决问题。这根本不解决问题。