Java 等待从客户端读取消息的套接字服务器
我有以下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
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