Я хочу создать многопоточный сервер, который одновременно разговаривает с несколькими клиентом. это проблема:
это код моего сервера:
import java.io.*;
import java.net.*;
public class Serveur extends Thread{
private MyFrame mf;
@SuppressWarnings("unused")
private FileAttente file;
private ServerSocket serveur ;
public Serveur(int port,MyFrame f,FileAttente file) throws IOException{
serveur = new ServerSocket(port);
this.mf = f;
this.file=file;
}
@Override
public void run() {
// TODO Auto-generated method stub
mf.console.append("\nServeur en écoute ... ");
while(true){
try {
SoClient threadClient = new SoClient(this.serveur.accept());
threadClient.start();
mf.console.append("\nUn nouveau client s'est connecté");
} catch (IOException e) {e.printStackTrace();}
}
}
}
У меня также есть эта строка: mf.console.append("\nUn nouveau client s'est connecté");
выполненных после получения каждого сообщения от клиента. Обычно он должен выполняться только тогда, когда приходит новый клиент.
это код сокета, где я размещаю все операции между клиентом и сервером:
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class SoClient extends Thread {
static MyFrame mf;
FileAttente file;
public static Socket client;
public SoClient(Socket client){
this.client=client;
}
public void run(){
MyFrame.console.append("\nConnexion établi : "+client.getInetAddress());
//Envoie et reception
try {
InputStream in = this.client.getInputStream();
OutputStream out = client.getOutputStream();
sleep(2);
DataInputStream is = new DataInputStream(in);
@SuppressWarnings("deprecation")
String request = is.readLine();
MyFrame.console.append("\nMessage d'un Client :"+request);
DataInputStream din = new DataInputStream(in);
sleep(2);
String chaine_Client=din.readUTF();
MyFrame.console.append("Client :"+chaine_Client);
client.close();
} catch (IOException | InterruptedException e) {}
}
}
Итак, что я хочу сделать, отправляет широковещательное сообщение с сервера всем клиентам, которые подключены или отправляют эхо-сообщение. Для клиента я создал класс, и я создаю его столько времени, сколько захочу. Класс Client и классы серверов находятся в двух проектах diffirents в Eclipse.
Вы определили клиент переменной класса в SoClient как статический:
public static Socket client;
и установите его в конструкторе.
Если у вас несколько экземпляров SoClient, все они работают с одним и тем же клиентом-Socket.
Это может вызвать более странные ошибки.
Удалите статическое ключевое слово и, надеюсь, работает.