私はJavaでプログラミングする方法を学んでおり、私は簡単なチャットプログラムを書くことに決めました。Javaの簡単なチャット - すべてのクライアントにメッセージを送信する
私は既にServer、Client、ThreadedConnectionクラスを書いています。今の私の目標は、クライアントからのメッセージが他のクライアントに表示されることです。 私の現在のコードは、次のように動作します。あるクライアントがメッセージを送信すると、他のクライアントはメッセージを送信したときにのみ受信します。 例: クライアント1: ハロー
ハロー
クライアント2 ハイテク
ハロー
クライアント3 いただきまし
ハイテク
まで私は、問題は、私は、サーバーからの入力を取得していた方法であると思います。おそらく私のプログラムはユーザ(stdin)からの入力を取得し、プログラムのさらなる部分の実行をブロックするまで待っています。しかし正直なところ、私は他の方法でそれをやる方法を知らない。
if((message=stdin.readLine())!=null)
out.println(message);
if((message=in.readLine())!=null)
System.out.println(message);
私はどんなヒントでも非常に感謝しています。私はインターネット上で答えを見つけようとしていましたが、通常私が見つけたプログラムは私にとって理解するのが難しかったです。
Serverコード:
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
public class Server {
private static List<ThreadedConnection> clientList=new ArrayList<>();;
public synchronized void broadcastMessageToAllClients(String message){
for(ThreadedConnection tc: clientList)
tc.sendMessage(message);
}
public static void main(String[] args) throws IOException {
try {
Server server=new Server();
ServerSocket serverSocket = new ServerSocket(8189);
while (true) {
Socket socket = serverSocket.accept();
Runnable threadedServer = new ThreadedConnection(socket, server);
clientList.add((ThreadedConnection)threadedServer);
Thread thread = new Thread(threadedServer);
thread.start();
}
} catch (Exception e) {
System.out.println("An error occured.");
e.printStackTrace();
}
}
}
ThreadedConnectionコード:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
public class ThreadedConnection implements Runnable {
private Server server;
private Socket socket;
private PrintWriter out;
private BufferedReader in;
public ThreadedConnection(Socket socket, Server server) {
this.socket = socket;
this.server = server;
}
@Override
public void run() {
try {
out = new PrintWriter(socket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String message;
while(true){
if((message=in.readLine())!=null)
server.broadcastMessageToAllClients(message);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void sendMessage(String message){
out.println(message);
}
}
クライアントコード:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
public class Client {
public static void main(String[] args) throws IOException {
try (
Socket socket = new Socket("127.0.0.1", 8189);
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
) {
String message;
while(true){
if((message=stdin.readLine())!=null)
out.println(message);
if((message=in.readLine())!=null)
System.out.println(message);
}
}
}
}
ソケットから読み取る専用スレッドが必要です。また、ソケット – ControlAltDel
を処理するためのフレームワークであるServerSocketEx(https://sourceforge.net/p/tus/code/HEAD/tree/tjacobs/io/)を見てみるとよいでしょう。私は作業を試みますそれ。 – drapo