Nie mogę znaleźć błędu, dobrze jest gdy włączę pierwszego klienta, ale gdy włączę drugiego to ten pierwszy gdzieś mi znika. To znaczy mogę wysłać wiadomość z obu klientów do serwera ale nie mogę wysłać z serwera do pierwszego klienta, przechwytuje to drugi. Nie mam pojęcia dlaczego.
Serwer
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
public class SerwerGUI extends JFrame
{
private JButton wyślij = new JButton("Wyślij");
protected static JTextArea tekstArea = new JTextArea();
private JScrollPane scrollPane = new JScrollPane(tekstArea);
private JPanel panel = new JPanel(null);
private static ArrayList<ObsługaKlienta> lista = new ArrayList<ObsługaKlienta>();
private static ServerSocket socket;
private static Socket mojSocket;
private static int IdDoNadania=0;
SerwerGUI()
{
new Połącz();
setTitle("Serwer");
setSize(300, 400);
add(panel);
scrollPane.setBounds(0, 0, getWidth()-15, 300);
panel.add(scrollPane);
wyślij.setBounds(100, 320, 80, 30);
panel.add(wyślij);
wyślij.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
// TODO Auto-generated method stub
lista.get(0).wyślijKomunikat();
}
});
setVisible(true);
}
/**
* @param args
*/
public static void main(String[] args)
{
// TODO Auto-generated method stub
SerwerGUI serwer = new SerwerGUI();
serwer.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
static class Połącz extends Thread
{
Połącz()
{
this.start();
}
public void run()
{
try
{
socket = new ServerSocket(8866);
} catch (IOException e)
{
// TODO Auto-generated catch block
tekstArea.append("Błąd: Nie można utworzyć Socketu\n");
}
while (true)
{
try
{
mojSocket = socket.accept();
} catch (IOException e)
{
// TODO Auto-generated catch block
tekstArea.append("Błąd: Nie można utworzyć nowego połączenia\n");
}
lista.add(new ObsługaKlienta(mojSocket));
tekstArea.append("Rozmiar listy: "+Integer.toString(lista.size())+"\n");
}
}
}
private static class ObsługaKlienta extends Thread
{
Socket kopiaMojSocket;
static ObjectInputStream in = null;
static ObjectOutputStream out = null;
static String incoming = null;
public ObsługaKlienta(Socket mojSocket)
{
// TODO Auto-generated constructor stub
kopiaMojSocket = mojSocket;
this.start();
}
public void run()
{
try
{
in = new ObjectInputStream(kopiaMojSocket.getInputStream());
} catch (IOException e)
{
// TODO Auto-generated catch block
tekstArea.append("Błąd: Nie można utworzyć strumienia wejściowego\n");
}
try
{
out = new ObjectOutputStream(kopiaMojSocket.getOutputStream());
} catch (IOException e)
{
// TODO Auto-generated catch block
tekstArea.append("Błąd: Nie można utworzyć strumienia wyjściowego\n");
}
new Odbieranie();
wyślijID();
}
public static void wyślijID()
{
try
{
out.writeObject(String.valueOf(IdDoNadania));
++IdDoNadania;
} catch (IOException e)
{
// TODO Auto-generated catch block
tekstArea.append("Błąd: Nie można wysłać Id\n");
}
}
public static void wyślijKomunikat()
{
try
{
out.writeObject("Hello world");
} catch (IOException e)
{
// TODO Auto-generated catch block
tekstArea.append("Błąd: Nie można wysłać komunikatu\n");
}
}
static class Odbieranie extends Thread
{
Odbieranie()
{
this.start();
}
public void run()
{
while (true)
{
try
{
incoming = (String) in.readObject();
} catch (ClassNotFoundException | IOException e1)
{
// TODO Auto-generated catch block
tekstArea.append("Błąd: Nie można odebrać komunikatu\n");
break;
}
tekstArea.append("Od klienta: "+incoming+"\n");
}
}
}
}
}
Klient
package SerwerIKlientTestowy;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.LayoutManager;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
public class KlientGUI extends JFrame
{
static JTextArea tekstArea = new JTextArea();
JScrollPane scrollPane = new JScrollPane(tekstArea);
static int id=-1;
Socket mojSocket;
JButton wyslij;
MyPanel panel;
ObjectOutputStream out;
static ObjectInputStream in;
KlientGUI()
{
socket();
new Odbieranie();
setSize(300,400);
setTitle("Klient");
panel = new MyPanel();
panel.setLayout(null);
panel.add(wyslij = new JButton("Wyślij"));
wyslij.setBounds(100, 320, 80, 30);
wyslij.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent arg0)
{
// TODO Auto-generated method stub
wyślij();
//komunikat.setText("ad");
}
});
scrollPane.setSize(getWidth()-20, 300);
panel.add(scrollPane);
add(panel);
setVisible(true);
}
public static void main(String[] args)
{
// TODO Auto-generated method stub
new KlientGUI().setDefaultCloseOperation(EXIT_ON_CLOSE);
}
class MyPanel extends JPanel
{
MyPanel()
{
super();
}
public void paintComponent(Graphics g)
{
super.paintComponents(g);
}
}
private void socket()
{
try
{
mojSocket = new Socket("localhost", 8866);
} catch (UnknownHostException e)
{
// TODO Auto-generated catch block
tekstArea.append("Błąd: Nie można utworzyć Socketu1\n");
} catch (IOException e)
{
// TODO Auto-generated catch block
tekstArea.append("Błąd: Nie można utworzyć Socketu2\n");
}
try
{
out = new ObjectOutputStream(mojSocket.getOutputStream());
} catch (IOException e)
{
// TODO Auto-generated catch block
tekstArea.append("Błąd: Nie można utworzyć strumienia wyjściowego\n");
}
try
{
in = new ObjectInputStream(mojSocket.getInputStream());
} catch (IOException e)
{
// TODO Auto-generated catch block
tekstArea.append("Błąd: Nie można utworzyć strumienia wejściowego\n");
}
}
static class Odbieranie extends Thread
{
String incoming = null;
Odbieranie()
{
this.start();
}
public void run()
{
odbiórID();
while (true)
{
incoming=null;
try
{
incoming = (String) in.readObject();
} catch (ClassNotFoundException | IOException e1)
{
// TODO Auto-generated catch block
tekstArea.append("Błąd: Nie można odebrać obiektu\n");
}
//System.out.println(incoming);
tekstArea.append("Serwer: "+incoming+"\n");
}
}
private void odbiórID()
{
try
{
incoming = (String) in.readObject();
} catch (ClassNotFoundException | IOException e1)
{
// TODO Auto-generated catch block
tekstArea.append("Błąd: Nie można odebrać Id\n");
}
tekstArea.append("ID= "+incoming+"\n");
id=Integer.parseInt(incoming);
}
}
private void wyślij()
{
try
{
out.writeObject("Id = "+id+" Hello World");
} catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}