Java 如何使服务器能够接受来自具有不同套接字连接的客户端的多个输入流?
我正在尝试创建一个简单的聊天服务器,它允许多个不同的客户端通过服务器输出控制台彼此聊天。每个客户端都有自己的线程写入服务器,并且可以通过控制台在服务器的标准输出上查看结果。但是,我似乎无法让Java 如何使服务器能够接受来自具有不同套接字连接的客户端的多个输入流?,java,multithreading,sockets,inputstream,bufferedreader,Java,Multithreading,Sockets,Inputstream,Bufferedreader,我正在尝试创建一个简单的聊天服务器,它允许多个不同的客户端通过服务器输出控制台彼此聊天。每个客户端都有自己的线程写入服务器,并且可以通过控制台在服务器的标准输出上查看结果。但是,我似乎无法让BufferedReader接收来自多个客户端套接字连接的消息 当前,第一个客户端线程通过其套接字获得对BufferedReader的独占访问权。但是,我希望多个客户端连接到服务器的输入流读取器,并让它等待来自具有不同套接字连接的多个客户端线程的输入。我希望客户端能够在同一时间发布到服务器。无论是否使用Buf
BufferedReader
接收来自多个客户端套接字连接的消息
当前,第一个客户端线程通过其套接字获得对BufferedReader
的独占访问权。但是,我希望多个客户端连接到服务器的输入流读取器,并让它等待来自具有不同套接字连接的多个客户端线程的输入。我希望客户端能够在同一时间发布到服务器。无论是否使用BufferedReader
作为输入流读取器,我将如何实现这一点
public class chatServer {
public chatServer() throws IOException {
int PORT = 8189;
try (ServerSocket server = new ServerSocket(PORT)) {
System.out.println("The server is running at "
+ InetAddress.getByName(null) + "...");
String rules = "The rules of this server are as follows:\n"
+ "1.Respect your fellow chatters\n"
+ "2.Vulgar language will result in punishment\n"
+ "3.We reserve the right to ban you at any time.\n"
+ "Enjoy!";
System.out.println(rules + "\n");
while (true) {
try {
new clientHandler(server.accept()).run();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) throws IOException {
chatServer cs = new chatServer();
}
class clientHandler implements Runnable {
Socket socket;
public clientHandler(Socket socket) {
this.socket = socket;
}
public void run() {
try {
BufferedReader in = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
String line;
while (true) {
line = in.readLine();
if ((line == null) || line.equalsIgnoreCase("exit")) {
// socket.close();
} else {
System.out.println(socket.getPort() + " > " + line);
}
}
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
更新:我正在寻找一种合适的/替代的方法来实现服务器的功能,该服务器可以接受来自具有不同套接字连接的不同客户端的多个帖子?如果我当前的实现无法做到这一点,那么我如何修改它来做到这一点呢?一个
BufferedReader
是围绕一个读卡器构建的,而这个读卡器又直接或间接地连接到一个数据源。一旦建成,就没有办法改变
简言之,你的问题毫无意义。每个客户机都有一个不同的套接字,而套接字又有其唯一的输入和输出流,而输出流又必须封装在每个客户机的一个不同的bufferedReader
中。不是所有客户端之间共享的
编辑您的实际问题与缓冲读取器
无关。在这里:
new clientHandler(server.accept()).run();
您正在内联运行处理程序,而不是作为单独的线程运行<代码>运行()应该是
new Thread(new clientHandler(socket.accept())).start();
我可以用什么来代替BufferedReader,这样我就可以在多个客户端之间共享类似的东西了。我正在寻找一种合适的方法来实现一个服务器,该服务器可以接受来自具有不同套接字连接的不同客户端的多个帖子?这里没有任何东西可以排除这一点。您刚刚对缓冲读取器的工作方式做出了错误的假设。您需要查看Java教程中的自定义网络部分。clientHandler扩展线程和it实现Runnable之间的区别是什么导致了我的问题?你说的“内联运行处理程序”是什么意思?我没有说任何关于扩展线程和实现Runnable的内容“内联”意味着,呃,不是作为一个单独的线程。
new Thread(new clientHandler(socket.accept())).start();