Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.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_Wait_Java Io - Fatal编程技术网

Java 等待从客户端读取消息的套接字服务器

Java 等待从客户端读取消息的套接字服务器,java,sockets,wait,java-io,Java,Sockets,Wait,Java Io,我有以下java套接字服务器 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 MiddleSocket { private ServerSocket middle

我有以下java套接字服务器

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 MiddleSocket {
    private ServerSocket middleman;
    private int port = 1027;
    private Socket client;


    protected void createSocketServer()
    {
        try
        {
            middleman = new ServerSocket(port);
            client = middleman.accept();
            middleman.close();
            PrintWriter out = new PrintWriter(client.getOutputStream(),true);
            BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
            BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
            while(true)
            {
                System.out.println("echo: " + in.readLine());
                out.println("test");
            }
        }
        catch(IOException e)
        {
            System.out.println(e);
        }
    }

}
它在如何读取客户端和所有内容方面都能正常工作。但是,我希望套接字服务器只在有来自客户端的消息时才尝试读取,因为在循环中,即使没有收到来自客户端的消息,它也会继续读取,这会输出一堆消息

echo:null


有没有一种机制缺少等待(),让while循环知道在从客户端发送消息时只是静坐等待,然后触发以读取该消息,并且在读取该消息并发送回复后,就可以一直静坐,直到收到来自客户端的下一条消息为止?

您可以使用InputStream.read(),或InputStream.read(字节[])。两者都会阻塞


您可以简单地执行以下操作:

String line;
while ((line = in.readLine()) != null) {
   \\Do stuff
}
这应该具有预期的行为

编辑:

下面是我在评论中使用您的代码所说内容的完整示例:

package javaapplication12;

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 SocketExample {
    private ServerSocket middleman;
    private int port = 8080;
    private Socket client;


    protected void createSocketServer()
    {
        try
        {
            while (true){
                middleman = new ServerSocket(port);
                client = middleman.accept();
                middleman.close();
                PrintWriter out = new PrintWriter(client.getOutputStream(),true);
                BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
                BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
                String line;
                while((line = in.readLine()) != null)
                {
                    System.out.println("echo: " + line);
                    out.println("test");
                }
            }
        }
        catch(IOException e)
        {
            System.out.println(e);
        }
    }

    public static void main(String[] args){
        SocketExample test = new SocketExample();
        test.createSocketServer();
    }
}
我希望套接字服务器只在有来自客户机的消息时才尝试读取,因为在循环中,即使没有收到来自客户机的消息,它也会继续读取,这会输出一堆消息


这是因为您忽略了流的末尾,这就是null的意思。这并不意味着根本没有来自客户端的消息。这意味着对等方已经关闭了连接。

但是我希望循环不要退出,因为我希望套接字服务器一直运行。然后,您应该在
上循环。接受
命令,该命令将处理从连接客户端接收到的任何输入,然后关闭连接,并等待新的输入。我将用一个例子修改我的答案。编辑我的答案以反映我上面提到的内容。当然,请记住,一次只能处理一个连接,但这是一个功能示例。请注意,while(true)循环代码的不同部分,这允许它接受无限多个连接,但处理每个连接所花费的时间有限,这正是您想要的。那么,如果一次需要n个连接,会发生什么呢?它会缓冲其他消息,然后在从上一个客户端接收到最后一条消息后发送这些消息吗?差不多!本质上,while(true)循环(而不是循环本身)中的所有内容都是线程的“内容”,您将拥有另一个带有“while(true)”循环的类,该循环具有.accept()方法并生成一个线程来处理连接,然后直接返回侦听新连接。查看此链接:
echo: null