Hallo,
ich habe da seit ein paar Tagen ein Problem mit einem Studienprojekt.
Man soll einen Chat auf UDP-Basis programmieren der genauso sicher wie auf TCP-Basis ist.
Man soll also diverse Absicherungsmechanismen implementieren.
Dazu wurde mir ein Gerüst mit einigen Klassen und Interfaces gegeben.
Das Ding hab ich jetzt zu 80% fertig komme jetzt aber einfach nicht weiter.
Man hat uns auch eine MOCK gegeben die es ermöglicht Verbindungen auf TCP-Basis zu verwenden um die ChatAnwendung (Server und Client) unabhängig, von der später zu erstellenden UDP-Lösung, zu implementieren.
Das Problem:
Ich starte den Server der erst mal super funktioniert. Dieser wartet nun auf ankommende Verbindungen.
Dann starte ich einen ChatClienten. Dort muss man erst mal seinen usernamen eingeben und dann wird eine Verbindung zum Server aufgebaut. Bei einem Clienten funktioniert das wunderbar.
Sobald ich allerdings einen zweiten Clienten starte hängt sich der auf.
Da es etwas viel Code ist werde ich die relevanten Codeteile posten. Sollte etwas fehlen oder unübersichtlich wirken - bitte bescheid geben.
Auflistung der verwendeten Klassen in der Reihenfolge wo sie verwendet werden:
- Client
- ClientCommunicator
- ChatClientServiceFactoryImpl
- ChatClientServiceImpl
- LWTRTServiceMock
- MockLWTRTConnection
Ablauf mit Code Auszügen. Ich markiere mit einem Pfeil wo die nächste Klasse verwendet wird. Alles was darunter ist wird also gar nicht mehr ausgeführt.
Client
[code=Java] public class Client{
public Client() {
communicator = new ClientCommunicator(this);
showLoginFrame();
}
class LoginListener extends MouseAdapter {
public void mouseClicked(MouseEvent e) {
userName = nameField.getText();
communicator.login(userName); <------------------------hier
loginFrame.dispose();
showChatFrame();
//Poller thread = new Poller();
//thread.start();
}
}
}
[/code]
ClientCommunicator:
[code=Java]
public class ClientCommunicator implements ChatClientListener{
public ClientCommunicator(Client gui) {
try {
factory = new ChatClientServiceFactoryImpl();
chatClient = factory.register(50002);
this.gui = gui;
}
catch (Exception e) { e.printStackTrace(); }
}
public void login(String name) {
try {
chatClient.registerChatSessionListener(this);
chatClient.create("127.0.0.1", 50000, name); <----------------hier
} catch (ChatServiceException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} [/code]
ChatClientServiceImpl:
[code=Java]
public class ChatClientServiceImpl extends BaseServiceImpl implements ChatClientService {
public void create(String rcvAdd, int port, String name) throws ChatServiceException {
if (currentStatus.equals(SessionStatus.NO_SESSION)) {
try {
connection = LWTRTServiceMock.INSTANCE.connect(listenport,rcvAdd, port); <---------------------hier
chatPdu = new ChatPdu();
userName = name;
chatPdu.setName(userName);
chatPdu.setOpId(ChatOpId.createSession_req_PDU);
connection.send(chatPdu);
this.startPollerThreadIfNotRunning();
currentStatus = SessionStatus.SESSION_ACTIVE;
} catch (LWTRTException e) {
throw new ChatServiceException(e);
}
} else{
throw new ChatServiceException(
"Keine Sessionaufbau, da bereits eine session vorhanden ist");
}
}
}[/code]
LWTRTServiceMock:
[code=Java]
public class LWTRTServiceMock implements LWTRTService{
public LWTRTConnection connect(int localPort, String remoteAddress, int remotePort) throws LWTRTException {
try {
log.debug("Connection from "+localPort+" to RemoteAdress: "+remoteAddress+":"+remotePort);
return new MockLWTRTConnection(new Socket(remoteAddress, remotePort)); <-----------hier
} catch (IOException e) {
throw new LWTRTException(e);
}
}
}
[/code]
MockLWTRTConnection:
[code=Java]
public class MockLWTRTConnection implements LWTRTConnection {
public MockLWTRTConnection(Socket socket) {
this.socket = socket;
[COLOR="Red"] retreiveStreamsIfConnected(socket);[/COLOR]
}
private void retreiveStreamsIfConnected(Socket socket) {
if (socket.isConnected()) {
try {
oout = new ObjectOutputStream(socket.getOutputStream());
oin = new ObjectInputStream(socket.getInputStream()); <--------------hier hängt er dann fest
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}[/code]
Mithilfe der Debugfunktion in Eclipse hab ich heraus gefunden das der bei oin hängen bleibt und wartet.
Das einzige was kurz zu sehen war der Wert ([toString() unavailable - no suspended threads]) der in oin gespeichert war. Sagt mir allerdings nichts.
oout funktioniert einwandfrei. Da wird ein ObjectOutputStream Objekt zugeodnet.
Woran kann das liegen? Wenn nur ein Client auf dem PC betrieben wird gehts einwandfrei. Nur wenn weitere Clienten gestartet werden pasiert das.
Braucht ihr noch weitere Informationen?
Beste Grüße
Assix