我正在尝试创建一个简单的聊天服务器,允许多个不同的客户端通过服务器输出控制台相互聊天。每个客户端都有自己的线程写入服务器,并可以通过控制台在服务器的标准输出上查看结果。但是,我似乎无法让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();
}
}
}
}
public class chatClient {
private Socket socket;
private String name = "";
private String IP = "127.0.0.1";
private int PORT = 8189;
public chatClient(String name, String IP, int PORT) throws UnknownHostException, IOException{
this.name = name;
socket = new Socket(this.IP,this.PORT);
}
public static void main(String[] args) throws UnknownHostException, IOException{
chatClient c1 = new chatClient("John",null,0);
chatClient.connect(c1);
}
public static void connect(chatClient cc) throws IOException {
Socket socket = cc.socket;
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
out.println("Welcome " + cc.name);
String message = "";
boolean done = false;
Scanner stdin = new Scanner(System.in);
System.out.println("Type your message here:");
while(!done){
System.out.print("> ");
message = stdin.nextLine();
out.println(message);
if(message.trim().equalsIgnoreCase("exit")){
done = true;
}
}
}
}
更新:我正在寻找一种合适/替代方法来实现服务器的功能,该服务器接受来自具有不同套接字连接的各种客户端的多个帖子?如果我当前的实现不能这样做那么我该如何修改呢?