Ich habe eine QuizServer-Anwendung in Java Swing erstellt, die über einen Socket mit mehreren Clients verbunden ist. Ich bin in der Lage, Daten von jedem Client gleichzeitig über die Socket-Verbindung an den Server zu senden, aber wenn ich versuche, Daten vom Server an die Clients zu senden, wird sie nur von 1 Client empfangen. Wie kann ich den Code ändern, um Daten an alle Clients zu senden, die gleichzeitig am Socket horchen? Jeder Code/Pseudocode wird geschätzt.Java: Senden von Daten von einem Server an alle Clients, die den Socket überwachen
Das ist meine Network Klasse:
public class NetworkClient {
PrintWriter os = null;
Socket s1 = null;
String line = null;
BufferedReader br = null;
BufferedReader is = null;
InetAddress address = null;
void initClient() {
try {
address = InetAddress.getLocalHost();
System.out.println(address);
} catch (UnknownHostException ex) {
Logger.getLogger(NetworkClient.class.getName()).log(Level.SEVERE, null, ex);
}
try {
s1 = new Socket(address, 8888); // You can use static final constant PORT_NUM
br = new BufferedReader(new InputStreamReader(System.in));
is = new BufferedReader(new InputStreamReader(s1.getInputStream()));
os = new PrintWriter(s1.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
System.err.print("IO Exception");
}
}
void sendVal(int data) {
os.println(data);
os.flush();
}
void close() {
try {
is.close();
os.close();
br.close();
s1.close();
} catch (Exception ex) {
Logger.getLogger(NetworkClient.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
Hier ist meine Server-Klasse:
public class QuizServer {
QuizJFrame frame;
ServerThread st;
void initServer(QuizJFrame frm) {
frame = frm;
Socket s = null;
ServerSocket ss2 = null;
System.out.println("Server Listening......");
try {
ss2 = new ServerSocket(8888); // port number used as 8888
} catch (IOException e) {
e.printStackTrace();
System.out.println("Server error");
}
while (true) {
try {
s = ss2.accept();
System.out.println("connection Established");
st = new ServerThread(s, frm);
st.start();
} catch (Exception e) {
e.printStackTrace();
System.out.println("Connection Error");
}
}
}
}
Dies ist der Server Thread-Klasse:
class ServerThread extends Thread {
BufferedReader is = null;
PrintWriter os = null;
Socket s = null;
QuizJFrame frame;
String question[] = {"", "QUESTION 1", "QUESTION 2", "QUESTION 3", "QUESTION 4", "END"};
int answer[] = {0, 1, 2, 3, 4};
int index;
public ServerThread(Socket s, QuizJFrame frm) {
this.s = s;
frame = frm;
index = 1;
frame.setQuestion(question[index]);
}
@Override
public void run() {
int option = 0;
try {
is = new BufferedReader(new InputStreamReader(s.getInputStream()));
os = new PrintWriter(s.getOutputStream());
} catch (IOException e) {
System.out.println("IO error in server thread:" + e);
}
try {
while (option > -1) {
try {
option = Integer.parseInt(is.readLine());
os.println(answer[index] == option);
os.flush();
} catch (NumberFormatException e) { //to handle null value
}
System.out.println(result(option));
frame.output(result(option));
}
} catch (IOException ex) {
Logger.getLogger(ServerThread.class.getName()).log(Level.SEVERE, null, ex);
}
}
String result(int op) {
if (op == -1) {
return "Client exited";
}
if (answer[index] == op) {
return "Option " + op + " is the correct answer.";
} else {
return "Option " + op + " is incorrect.";
}
}
void nextQues() {
index++;
frame.setQuestion(question[index]);
os.println(-2);
os.flush();
}
}
EDIT: Mit List<ServerThread>
die aufgelöste Problem.
Danke für Ihre Hilfe! –
Ich habe versucht, Runnable ausführbar, aber die GUI wird geschlagen, während es mit erweitert Thread funktioniert. Und können Sie bitte einen beliebigen Pseudocode für das Upgrade der ServerThread-Klasse bereitstellen? –