Witam,
sluchajcie mam nastepujacy program, jest to komunikator sieciowy (mozliwosc sprawdzenia dzialania na wlasnym kompie). Sprawa wyglada tak ze wystepuje on w dwoch osobnych plikach, chce go polaczyc tak aby byl w jednym pliku i odpalal sie w jednym oknie. Program jest juz polaczony.. natomiast wystepuja 2 powazne bledy.. po pierwsze po wpisaniu komendy END i wcisnieciu SEND button ten (SEND) powinien sie wyszarzyc (i tak tez robi, aleee...) dla dwoch komputerow to dziala... dla 3ech juz nie.. cos namieszalem chyba w kodzie servera... gdyz jezeli wpisuje END na komp1 to komp2 wylacza komp3... czyli jest nie tak bo komp 1 powinen odlaczyc sie i na tym koniec... druga rzecz to to ze serwer przed polaczeniem programow zamyka sesje a po polaczeniu juz nie. Pomozcie poprawic owe bledy.
Oto kody:
PRZED POLACZENIEM:
FrameClientApp:
import java.io.*;
import java.net.*;
import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
public class FrameClientApp extends JFrame
{
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");
JMenuBar jMenuBar = new JMenuBar();
JMenu jMenuFile = new JMenu();
JMenuItem jMenuFileExit = new JMenuItem();
public static final int PORT = 8080;
public FrameClientApp(String title)
{
super(title);
JPanel p = new JPanel(new GridLayout(2,2));
send.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
sendInformation();
}
});
p.add(l1);
p.add(text1);
p.add(text2);
p.add(send);
jMenuFile.setText("File");
jMenuFileExit.setText("Exit");
jMenuFile.add(jMenuFileExit);
jMenuBar.add(jMenuFile);
setJMenuBar(jMenuBar);
jMenuFileExit.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
System.exit(0);
}
});
getContentPane().add(p);
setSize(300, 100);
}
private void sendInformation()
{
try
{
InetAddress addr = InetAddress.getByName(text1.getText());
System.out.println("addr = " + addr);
Socket socket = new Socket(addr, PORT);
try
{
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
out.println(text2.getText());
String str = in.readLine();
System.out.println(str);
out.println("END");
}
finally
{
System.out.println("closing...");
socket.close();
}
}
catch(IOException e)
{
System.out.println(e);
}
catch(Exception e)
{
System.out.println(e);
}
}
public static void main(String[] args) throws IOException
{
System.out.println("Start Applikacji");
FrameClientApp frame = new FrameClientApp("Client Application");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
FrameServerApp:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import java.net.*;
public class FrameServerApp extends JFrame // jframe bo chcemy miec okienko w programie z package swing
{
JTextArea jTextArea = new JTextArea(1,1); //j text fild dziala tak samo jak area. roznia sie tym ze txt field mozna w jedym wierszu wpisywac info. a tutaj jest taki prosty edytor tekstu
JMenuBar jMenuBar = new JMenuBar();
JMenu jMenuFile = new JMenu();
JMenuItem jMenuFileExit = new JMenuItem();
//tworzenie menu takie jak w client
Server server; //zmienna server klasy server //klasa wewnetrzna i jest ukryta we wnetrzu innej klasy
public class Connection extends Thread
{
Socket socket;
JTextArea textArea;
Connection(Socket s, JTextArea ta)
{
socket = s;// zapamietuje pod swoimi zmiennymi
textArea = ta;
}
void addText(String s)
{
textArea.setText(s + "\n" + textArea.getText());
}
public void run()
{
try
{
try
{
this.addText("------------------------------");
this.addText("Connection accepted:" + socket);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));//inn i out bo chcemy znim rozmawiac
PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
while (true)
{
String str = in.readLine();// za pomoca instrukcji readLine czytamy ta linie ktora przyslal klient
if ( str.equals("END"))//str jest obiektem
{
break;
}
this.addText("Text : " + str);
out.println(str);//odsy³a clientowi
}
}
finally
{
this.addText("closing..."); //zamyka socket i obiekt connection umiera po wyjsciu z run
socket.close();
}
}
catch(IOException e)
{
;
}
}
}
//klasa wewnetrzna jest zdefiniowana wewnatrz innej klasy
//connetion i server
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()//ponizej pêtelka ktora powoduje zatrzymanie watku w metoc\dzie run
{
while(working)//typu boolean true w petli siedzimy do konca
{
try //gadamy z klientem przez siec dlatego musi sie pojawic try i catch
{
ServerSocket s = new ServerSocket(PORT); //kreujemy server socket, specjalna odmiana, podaje si enr portu na kotrym jest otwarty. Server socket otwiera sie na wszystkim na czym sie da, wszytskjo co jest podlaczone do sieci.
this.addText("Started: " + s);
try
{
Socket socket = s.accept();//wisi. akceptujemy polaczenie metoda accept//w wyniku tego powstaje obiek socket
Connection c = new Connection(socket, textArea);//na connection wola sie start. //te obiekty zyja tak dlugo ja trzyma ja metoda run
c.start();
}
finally
{
s.close();//zamyklay server socket
/*ServerSocket s - tak powinno si episac!!
while(true)
{s.accept}
{}s.close()*/
}
}
catch(IOException e)
{
; //!!!!!! tak nei pisaæ, musi byc rozwiazanie - cicha obsluga bledow chociaz system.out.println("na konsoli wyswietlic co sie stalo")
}
}
}
}
public FrameServerApp()
{
try
{
jbInit();
}
catch(Exception e)
{
e.printStackTrace();
}
}
public static void main(String[] args)
{
FrameServerApp frameServerApp = new FrameServerApp();
frameServerApp.setVisible(true);
}
private void jbInit() throws Exception //jbInit traktujemy jak konstruktor
{//tworze siemenu tak jak w cliencie
jMenuFile.setText("File");
jMenuFileExit.setText("Exit");
jMenuFile.add(jMenuFileExit);
jMenuBar.add(jMenuFile);
this.setJMenuBar(jMenuBar);//end omawianie clienta
jMenuFileExit.addActionListener(new ActionListener()//przy akcji na obeikcie server bedzie
{
public void actionPerformed(ActionEvent e)
{
server.end();
System.exit(0);//bezzwloczne wyjscie programu w javie
}
});
this.setDefaultCloseOperation(3); //krzyzykiem zamykajac okno zamykamy tez program (3)dlatego ze sun da³ dupy;]zapomnieli zdefiniowac tej stalej [exit_on_close] z ta trojka nie piszemy
//this.getContentPane().setLayout(new GridLayout(2,1));
this.getContentPane().setLayout(new BorderLayout()); //layout ustawiamy na border bo do centum wstawiamy jtextarea
this.getContentPane().add(jTextArea, BorderLayout.CENTER);
this.setSize(400,300);
server = new Server(jTextArea); //kreujemy obiekt serwer //
server.start();//server dziedziczy z thread
}
}
PROGRAM PO POLACZENIU:
import java.io.*;
import java.net.*;
import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
public class AplikacjaSerwera extends JFrame
{
JTextArea jTextArea = new JTextArea(1,1);//obszar tekstu
Server server;
Socket socket;
boolean conn=false;
BufferedReader in;
PrintWriter out;
JMenuBar jMenuBar = new JMenuBar();
JMenu jMenuFile = new JMenu();
JMenuItem jMenuFileExit = new JMenuItem();
JLabel l1 = new JLabel("Server address:");
JTextField text1 = new JTextField("127.0.0.1");
JTextField text2 = new JTextField("Tu wpisz tekst");
JButton send = new JButton("Send");
JButton ConnButt = new JButton("Connect");
public static final int PORT = 8080;
public AplikacjaSerwera(String title)
{
super(title);
JPanel p = new JPanel(new GridLayout(2,3));
JPanel p2 = new JPanel(new GridLayout(3,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(l1);
p2.add(text1);
p2.add(text2);
p2.add(send);
p2.add(ConnButt);
p.add(jTextArea);
p.add(p2);
jMenuFile.setText("File");
jMenuFileExit.setText("Quit");
jMenuFile.add(jMenuFileExit);
jMenuBar.add(jMenuFile);
setJMenuBar(jMenuBar);
jMenuFileExit.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
System.exit(0);
}
});
getContentPane().add(p);
setSize(500, 400);
server = new Server(jTextArea);
server.start();
}
private void connect()
{
try
{
InetAddress addr = InetAddress.getByName(text1.getText());
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;
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
ConnButt.setText("Disconnect");
send.setEnabled(true);
}
catch(IOException e)
{
System.out.println(e);//obs³uga b³êdu (wypisanie b³êdu)
jTextArea.append("B³¹d po³¹czenia");
}
catch(Exception e)
{
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)
{
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("Connect");
conn=false;
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
{
System.out.println("Start Aplikacji");
AplikacjaSerwera frame = new AplikacjaSerwera("GaduGadu2010");
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();
if ( str.equals("END"))//sprawdza czy nie jest 'END', nie rozlacza po przyjeciu
{
disconnect();
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);
this.addText("Started: " + s);
try
{
Socket socket = s.accept();
Connection c = new Connection(socket, textArea);
c.start();
}
finally
{
s.close();
}
}
catch(IOException e)
{
;
}
}
}
}
}
Takze moze znajdzie sie osoba ktora pomoze i wyjasni w czym problem