Witam, napisałem sobie w Javie dwie aplikacje socketowe, serwer i klient.
Wszystko działa dobrze, ale chciałbym dodać do tego ciągłe sprawdzanie czy dany klient jest podłączony do serwera, i jeśli się rozłączył to wysłanie stosownej wiadomości wszystkim pozostałym klientom. Aktualnie mam to zrobione tak, że klient po naciśnięciu "X"(zamknięciu okna) wysyła wiadomość "exit" do serwera, i ten wtedy notuje, że dany klient się rozłączył. Lecz zdarza się, że wiadomość się nie wysyła, np. gdy zamknę proces aplikacji.
Kod serwera(nie cały):
public class Server extends JFrame implements ActionListener, KeyListener
{
private static final int PORT = 50000;
static boolean flaga = true;
static JPanel GUI = new JPanel();
static JTextArea panel = new JTextArea();
static JTextField komenda = new JTextField();
private static ServerSocket serverSocket = null;
static String wyslij=null;
static String IP;
JButton SendCommand;
static Socket incoming;
static int clients;
static int inpC;
static int wysC;
static String wysl;
static String inpu;
static String nameC;
static String nameOC;
public static void main(String[] args) throws IOException
{
try
{
InetAddress ownIP=InetAddress.getLocalHost();
IP=ownIP.getHostAddress();
}
catch (Exception e)
{
//
}
new Server();
try
{
try
{
serverSocket = new ServerSocket(PORT);
}
catch(IOException e)
{
panel.setText(panel.getText()+"***Nie mogę nasłuchiwać na porcie: "+PORT+"\n");
System.exit(1);
}
while(true)
{
//panel.setText(panel.getText()+"***Oczekuję na połączenie...\n");
incoming = serverSocket.accept();
clients++;
new Thread()
{
public void run()
{
try
{
String name="Serwer";
String clientName="";
String oldClientName;
InputStream inStream = incoming.getInputStream();
OutputStream outStream = incoming.getOutputStream();
Scanner in = new Scanner(inStream);
PrintWriter out = new PrintWriter(outStream, true);
String iIP=""+incoming.getInetAddress();
String lIP=""+incoming.getLocalAddress();
iIP=iIP.replace('/', ' ');
lIP=lIP.replace('/', ' ');
panel.setText(panel.getText()+"***Połączono z" + iIP + " na porcie "
+ incoming.getPort() + " do portu " + incoming.getLocalPort() + " z"
+ lIP+"\n");
out.println("");
try
{
while(true)
{
out.println("");
if(in.hasNextLine())
{
String input = in.nextLine();
if(inpu!=null && inpu.length()>0)
{
if(inpC<clients-1)
{
inpC++;
if (inpu.equals("exit") || inpu.equals("disconnect"))
{
out.println(nameC+" opuścił serwer.\n");
}
else if(inpu.contains("name") && !inpu.contains("qname") && (inpu.substring(5,inpu.length())).length()>3)
{
out.println("***"+nameOC+" zmienił nick na "+nameC+".");
}
else if(!inpu.contains("qname"))
{
out.println(nameC+": "+inpu);
}
}
else
{
inpC=0;
inpu=null;
nameC=null;
nameOC=null;
}
}
if(wysl!=null && wysl.length()>0)
{
if(wysC<clients-1)
{
wysC++;
if(wysl.contains("name") && !wysl.contains("qname") && (wysl.substring(5,wysl.length())).length()>3 && (wysl.substring(5,wysl.length())).length()<20)
{
out.println("***"+name+" zmienił nick na "+wysl.substring(5,wysl.length())+".");
name=wysl.substring(5,wysl.length());
}
else if(!wysl.contains("qname"))
out.println(name+": "+wysl+"\n");
}
else
{
wysC=0;
wysl=null;
}
}
if(input!=null && input.length()>0)
{
inpu=input;
nameC=clientName;
}
if(wyslij!= null && wyslij.length() > 0)
wysl=wyslij;
if (input.equals("exit") || input.equals("disconnect"))
{
panel.setText(panel.getText()+"***"+clientName+"("+iIP+")"+" opuścił serwer.\n");
clients--;
input=null;
stop();
in.close();
out.close();
incoming.close();
return;
}
if(input!=null && input.contains("qname") && (input.substring(6,input.length())).length()<20 && (input.substring(6,input.length())).length()>3)
{
oldClientName=clientName;
clientName=input.substring(6,input.length());
nameC=clientName;
nameOC=oldClientName;
input=null;
}
else if(input!=null && input.contains("name") && (input.substring(5,input.length())).length()>3 && (input.substring(5,input.length())).length()<20)
{
oldClientName=clientName;
clientName=input.substring(5,input.length());
panel.setText(panel.getText()+"***"+oldClientName+" zmienił nick na "+clientName+".\n");
out.println("***"+oldClientName+" zmienił nick na "+clientName+".");
nameC=clientName;
nameOC=oldClientName;
input=null;
}
if(input!=null && input.length()>0)
{
panel.setText(panel.getText()+clientName+": "+input+"\n");
out.println(clientName+": "+input);
}
if(wyslij!=null && wyslij.contains("name") && (wyslij.substring(5,wyslij.length())).length()>3 && (wyslij.substring(5,wyslij.length())).length()<20)
{
panel.setText(panel.getText()+"***"+name+" zmienił nick na "+wyslij.substring(5,wyslij.length())+".\n");
name=wyslij.substring(5,wyslij.length());
wyslij=null;
}
if(wyslij!= null && wyslij.length() > 0)
{
out.println(name+": "+wyslij+"\n");
panel.setText(panel.getText()+name+": "+wyslij+"\n");
wyslij=null;
}
String atext=panel.getText();
String[] aatext=atext.split("\n");
int caatext=aatext.length;
if(caatext>25)
{
panel.setText("");
int toDelete=caatext-25;
for(int i=0;i<toDelete;i++)
aatext[i]="***DELETE***";
for(int i=0;i<caatext;i++)
{
if(!aatext[i].equals("***DELETE***"))
{
String txt=""+aatext[i];
String[] txt2=txt.split("\n");
if(txt2[0].contains("\n"))
panel.setText(panel.getText()+txt2[0]);
else
panel.setText(panel.getText()+txt2[0]+"\n");
}
}
}
}
Thread.sleep(50);
}
}
catch(InterruptedException ie)
{
//
}
finally
{
panel.setText(panel.getText()+"Rozłączono\n");
incoming.close();
}
}
catch (IOException e)
{
e.printStackTrace();
}
}
}.start();
}
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
Próbowałem sam dodawać takie sprawdzanie, ale nie chciało mi to za bardzo działać.
Proszę o przykłady jak to zrobić lub dodanie własnego kodu do tego podanego przeze mnie wyżej.