Problem przy wysylaniu

0

Program po połaczeniu do klienta działa, wysyła wiadomosci. Problem w tym że po rozłączeniu serwera wciąż można wysyłać wiadomości, a chcialbym aby nie mozna bylo, badz wyswietlalo odpowiedni komunikat chociaz. najlatwiej sprawdzic to laczac sie i wpisujac END w okienku wiadomosci.

Ponizej kod

import java.io.;
import java.net.
;//* - wszystko z tego katalogu w tym poziomie
import java.awt.event.;//katalogi znajduja sie w spakowanej bibliotecejavy
import java.awt.
;
import javax.swing.*; //swing - komponenty graficzne (przyciski)

public class ClientServer extends JFrame /*public/private - naglowek
klasy, mowi kto moze z niej skorzystac,
klasa - opis tego co powstanie */
{
JLabel l1 = new JLabel("Server address :");
JTextField text1 = new JTextField("127.0.0.1");
JTextField text2 = new JTextField("Tekst do wyslania");
JButton send = new JButton("Send");
JButton ConnButt = new JButton("Połącz");
JMenuBar jMenuBar = new JMenuBar();
JMenu jMenuFile = new JMenu();
JMenuItem jMenuFileExit = new JMenuItem();
public static final int PORT = 8080;
JTextArea jTextArea = new JTextArea(1,1);//textarea -obszar tekstu/textfield -jedna linia
Server server;//klasa wewnetrzna
Socket socket;
boolean conn=false;
BufferedReader in;
PrintWriter out;

public ClientServer(String title)
{
super(title); //wywoluje konstruktor klasy Jframe - mozna dopisac kod dodatkowy
JPanel p = new JPanel(new GridLayout(3,2));
JPanel p2 = new JPanel(new GridLayout(5,1));
send.setEnabled(false);
send.addActionListener(new ActionListener()// kod obslugi zdarzen (wysyla)
{
public void actionPerformed(ActionEvent e)//przekazuje informacje za pomoca parametru 'e'
{
sendInformation();
}
});

ConnButt.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
if (!conn) { //jesli nie polaczony
connect();//polacz
}
else disconnect();
}
});
p2.add(ConnButt);
p2.add(l1);
p2.add(text1);
p2.add(text2);
p2.add(send);
p.add(p2);
p.add(jTextArea);

jMenuFile.setText("File");
jMenuFileExit.setText("Exit");
jMenuFile.add(jMenuFileExit);
jMenuBar.add(jMenuFile);
setJMenuBar(jMenuBar);//przytwierdzamy belke
jMenuFileExit.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e) //exit
{
System.exit(0);//kod bledu wyjscia programu =0
}
});
getContentPane().add(p); //zwraca obiekt - od razu wykorzystuje
setSize(500, 400);
server = new Server(jTextArea);
server.start();

}

private void connect()
{
try
{
InetAddress addr = InetAddress.getByName(text1.getText()); ////pobiera z komponentu graf. wpisany tekst (kreuje adres)
System.out.println("addr = " + addr); //
socket = new Socket(addr, PORT); //kreuje fizyczne połączenie do drugiej strony, tworzy się obiekt Socket (IP i port)
conn = true; //jestesmy polaczeni
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
/*getInputStream - wyciąga dane / InputStreamReader - obiekt
przetwarzający dane
BufferedReader - zwraca całą linię odkodowanych danych */

out = new PrintWriter(new BufferedWriter(new
OutputStreamWriter(socket.getOutputStream())), true);
//wypisywanie(wysyłanie) danych na inny komputer
ConnButt.setText("Rozłącz");
send.setEnabled(true);
}
catch(IOException e)// szczegółowe informacje o błędzie IO
{
System.out.println(e);//obsługa błędu (wypisanie błędu)
jTextArea.append("Błąd połączenia");

}
catch(Exception e)//ogólne informacje o błędzie
{
System.out.println(e);
jTextArea.append("Błąd połączenia");
}
}

private void sendInformation()
{

try
{
out.println(text2.getText());
String str = in.readLine();
System.out.println(str);
}
catch(SocketException e) //dodane - gdy problemy z wyslaniem
{
System.out.println("Błąd połączenia");
jTextArea.append("Błąd połączenia!\n");
this.disconnect();
}
catch(IOException e)
{
System.out.println(e);
}
catch(Exception e)
{
System.out.println(e);
}
}

private void disconnect()
{
try
{
out.println("END"); //dane o zakończeniu aplikacji dla programu.
System.out.println("zamykanie..."); //zamkniecie połaczenia
socket.close();
ConnButt.setText("Połącz");
conn=false; //zmieniamy znacznik polaczenia
send.setEnabled(false);
}
catch(IOException e)
{
System.out.println(e);
}
catch(Exception e)
{
System.out.println(e);
}
}
public static void main(String[] args) throws IOException //main jestm statyczny
{
System.out.println("Start Applikacji");
ClientServer frame = new ClientServer("Client Application");//tytul okienka 'client application'
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//przy nacisniecium X zamyka okno
frame.setVisible(true);
}

public class Connection extends Thread//klasa thread obsluguje 2-gi wątek
{
Socket socket;
JTextArea textArea;
Connection(Socket s, JTextArea ta)
{
socket = s;
textArea = ta;
}

void addText(String s)
{
textArea.setText(s + "\n" + textArea.getText());
}

public void run()//2-gi watek znajduje sie w metodzie run -nie moze wyjsc
{
try
{
try
{
this.addText("------------------------------");
this.addText("Connection accepted:" + socket);
BufferedReader in = new BufferedReader(new
InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(new BufferedWriter(new
OutputStreamWriter(socket.getOutputStream())), true);
while (true)
{
String str = in.readLine();//odbiera co klient przyslal
if ( str.equals("END"))//sprawdza czy nie jest 'END', nie rozlacza po przyjeciu
{
break;
}
this.addText("Text : " + str);
out.println(str);
}
}
finally
{
this.addText("closing...");
socket.close();
}
}
catch(IOException e)
{
;
}

}
}

public class Server extends Thread
{
public static final int PORT = 8080;
JTextArea textArea;
boolean working = true;
Server(JTextArea ta)
{
textArea = ta;
}

void addText(String s)
{
textArea.setText(s + "\n" + textArea.getText());
}

public void end()
{
working = false;
}

public void run()
{
while(working)
{
try
{
ServerSocket s = new ServerSocket(PORT);//socket jest tworzony zdalnie na kims/serversocket jest tworzony po naszej stronie
//przydziela wolny port na sockecie
this.addText("Started: " + s);
try
{
Socket socket = s.accept();//socket czeka na akcept
Connection c = new Connection(socket, textArea);//connection jako nowy obiekt rozmawia
c.start();
}
finally
{
s.close();
}
}
catch(IOException e)
{
;
}
}
}
}
}

0

Sformatuj kod porządnie i umieść w znacznikach < code>
W sendInformation daj sprawdzenie, czy połączenie ciągle jest aktywne, jeżeli nie, to wywal błąd.

1 użytkowników online, w tym zalogowanych: 0, gości: 1