私は、複数の異なるクライアントがサーバー出力コンソールを介して互いにチャットできるようにする簡単なチャットサーバーを作成しようとしています。それぞれ独自のスレッドを持つクライアントは、サーバーに書き込みを行い、コンソールを介してサーバーの標準出力に結果を表示できます。しかし、私は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;
}
}
}
}
アップデート:私は明確なソケット接続で様々なクライアントからの複数の投稿を受け付けServerの機能を達成するための代替/適切な方法を探していますか?私の現在の実装がそうすることができない場合、どうすればそれを変更することができますか?
でなければなりません。私は別のソケット接続でさまざまなクライアントからの複数の投稿を受け入れるサーバーを達成するための適切なメソッドを探していますか? – Delrog
これを排除するものは何もありません。あなたはバッファリングされた読者がどのように働くかについて悪い仮定をしました。 Javaチュートリアルのカスタムネットワーキングのセクションを見る必要があります。 – EJP
clientHandlerとThreadとの違いは何ですか?問題を引き起こしたRunnableを実装していますか? 「ハンドラをインラインで実行する」とはどういう意味ですか? – Delrog