Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

[Sockets]Problem beim Senden von Objekten

0 views
Skip to first unread message

Achim Hilwers

unread,
Jun 20, 2003, 2:22:44 PM6/20/03
to
Hallo!

Ich versuche gerade, über Sockets Nachrichten zwischen einem Client und
einem Server auszutauschen.

Jede dieser Nachrichten ist eine Arraylist, deren Elemente die jeweiligen
Parameter sind (Message-Typ, Message-id und abhängig vom Typ weiter
Parameter)

Sowohl auf dem Client als auch auf dem Server laufen Threads um Nachrichten
senden und empfangen zu können.

Schicke ich jede Nachricht direkt an den Client, so verpasst er die Hälfte,
wenn innerhalb eines Durchlaufs des Server-Threads mehrere Nachrichten an
ihn versandt werden. Also habe ich mich entschlossen, serverseitig alle
Nachrichten zunächst einmal in eine ArrayList zu speichern und von dieser
List in einem Thread-Durchlauf nur die jeweils erste Nachricht zu senden.

Die Run-Methode des Threads sieht so aus:

public void run() {
System.out.println("Socket started: "+player.getClientSocket());
boolean disconnected = false;
while (!disconnected) {
try {
Thread.sleep(100);
synchronized(player) {
this.readMessages();
this.sendFirstMessage();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

Die Nachrichten füge ich ganz einfach folgendermaßen zur Liste hinzu:

public void addMessage(Message message) {
synchronized(messages) {
this.messages.add(message);
}
}

Und so wird dann jeweils die erste Nachricht versandt:

protected void sendFirstMessage() {
try {
synchronized(messages) {
Iterator it = messages.iterator();
synchronized(it) {
if (it.hasNext()) {
Message message = (Message)it.next();
System.out.println("Sending message "+message.getMessageType()+"
to client...");
ObjectOutputStream os = new
ObjectOutputStream(this.getPlayer().getClientSocket().getOutputStream());
os.writeObject(message);
//delete sent message:
it.remove();
System.out.println("Message sent.");
} //if it.hasnext
} //sybchronized it
} //synchronized
} catch (IOException e) {
System.out.println("Could not send message to the client.");
e.printStackTrace();
}
}

Nun füge ich testweise zwei Nachrichten direkt hintereinander hinzu, der
Thread verschickt aber immer nur eine davon, die der Client auch emfängt.
Es kann sein, daß ich blind bin, aber ich kann mir nicht erklären, warum -
beim nächsten Durchlauf müßte doch auch die nächste Message verschickt
werden. Kann mir jemand sagen, was ich da falsch mache?

Fällt evtl. jemandem auch noch eine andere Methode ein, mit dem ich schnell
hintereinander folgende Nachrichten nicht verpasse?

Gruß!

Achim

Achim Hilwers

unread,
Jun 20, 2003, 3:51:36 PM6/20/03
to
Nachtrag:

Schließe ich den Client, fällt dem Herren Server auf einmal ein, daß er ja
noch eine Meesage schicken wollte:

Das macht er, so lange alles läuft:

Sending message 31 to client...
Message sent.

Das sollte auch so sein, nur daß nun die zweite Message folgen sollte, was
sie nicht tut. In dem Moment, in dem ich den Client schließe, kommt das
hier:

Sending message 31 to client...


Could not send message to the client.

java.net.SocketException: Socket closed
at java.net.SocketOutputStream.socketWrite0(Native Method)
at
java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
at java.net.SocketOutputStream.write(SocketOutputStream.java:126)
at java.io.ObjectOutputStream$BlockDataOutputStream.drain
(ObjectOutputStream.java:1637)
at java.io.ObjectOutputStream$BlockDataOutputStream.setBlockDataMode
(ObjectOutputStream.java:1546)
at
java.io.ObjectOutputStream.writeNonProxyDesc(ObjectOutputStream.java:1146)
at
java.io.ObjectOutputStream.writeClassDesc(ObjectOutputStream.java:1100)
at
java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1239)
at
java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1052)
at
java.io.ObjectOutputStream.writeFatalException(ObjectOutputStream.java:1353)
at
java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:281)
at com.hilwers.connect4.server.ClientHandler.sendFirstMessage
(ClientHandler.java:81)
at
com.hilwers.connect4.server.ClientHandler.run(ClientHandler.java:57)
Sending message 31 to client...


Could not send message to the client.

java.net.SocketException: Socket closed
at java.net.SocketOutputStream.socketWrite0(Native Method)

usw. bis ich den Server beende.

Woran kann das liegen, daß die Message so lange liegen bleibt, bis ich den
Client schließe und sie dann natürlich nicht mehr gesendet werden kann?

Gruß!

Achim

Achim Hilwers

unread,
Jun 20, 2003, 4:45:11 PM6/20/03
to
OK, ich habe gerade herausgefunden, daß die readObject-Methode alles blockt,
so lange nichts da ist - da muß ich mir wohl einen Extra-Thread zum Lesen
basteln.

Gruß!

Achim

0 new messages