Aplikacja serwer - wielu klientów. Serwer i klient przesyłają między sobą obiekty. Po stronie klienta odbywa się to w wątku kontrolera sieci. Łączenie i rozłączanie są obsługiwane lokalnie, reszta jest wysyłana przez ObjectOutputStream do serwera. Chciałbym również odbierać dane z serwera za pomocą ObjectInputStream, ale poniższa implementacja nie działa, problemy opisałem niżej.
@Override
public void run()
{
while(true)
{
//PORT = view.pokerFrame.getClientPanel().getPort();
//HOST = view.pokerFrame.getClientPanel().getIPAddress();
try
{
ApplicationEvent event = blockingQueue.poll();
if(event !=null)
{
if(event instanceof ConnectEvent)
{
client = new Client(HOST, PORT, this);
}
else if(event instanceof DisconnectEvent)
{
client.getSocket().close();
view.pokerFrame.getClientPanel().setDisonnectButtonEnabled(false);
view.pokerFrame.getClientPanel().setConnectButtonEnabled(true);
}
else
{
client.getOOS().writeObject(event);
}
}
Object object = (Object) client.getOIS().readObject();
if(object instanceof String)
{
String info = (String) object;
view.pokerFrame.getClientPanel().addMessage(info);
}
}
catch(NullPointerException e) {}
catch(Exception e)
{
e.printStackTrace();
throw new RuntimeException(e);
}
}
}
Problem jest taki, że jeżeli kliknę połącz i zostanie stworzony nowy obiekt klienta to wątek staje. Nie mogę wysyłać żadnych informacji do serwera i tym samym nic odebrać. Jeżeli usunę fragment z czytaniem inputu, z kolejki blokującej będę wyjmował metodą put() to działa, tj łączę się i mogę wysyłać obiekty do serwera. Pytanie czy stworzenie obiektu klient ma jakiś wpływ na wątek - tzn ma, bo wątek staje, ale jaki?
public class Client
{
//private final int PORT;
//private final String HOST;
private Socket socket;
private ObjectInputStream ois;
private ObjectOutputStream oos;
private final NetworkModel networkModel;
public Client(final String HOST, final int PORT, final NetworkModel networkModel)
{
this.networkModel = networkModel;
try
{
socket = new Socket(HOST, PORT);
oos = new ObjectOutputStream(socket.getOutputStream());
ois = new ObjectInputStream(socket.getInputStream());
networkModel.getView().pokerFrame.getClientPanel().addMessage("Poloczono z " + HOST + ":" + PORT);
networkModel.getView().pokerFrame.getClientPanel().setConnectButtonEnabled(false);
networkModel.getView().pokerFrame.getClientPanel().setDisonnectButtonEnabled(true);
}
catch(Exception e)
{
networkModel.getView().pokerFrame.getClientPanel().addMessage("Nie mozna polaczyc z " + HOST + ":" + PORT);
}
}
public Socket getSocket()
{
return socket;
}
public ObjectInputStream getOIS()
{
return ois;
}
public ObjectOutputStream getOOS()
{
return oos;
}
}