Java-Client/Server-chat-Raum-das senden von Nachrichten als Objekte
Mein Ziel ist ein server, der eine Nachricht empfängt, die ObjectInputStream-Objekt aus, und klicken Sie dann echos, das Message-Objekt ObjectOutputStream.
Beim schreiben einer Nachricht, sendet der client die Message-Typ-Objekt auf dem server, wird die empfangene Nachricht vom Typ Objekt (sowie der Message type-Objekt von anderen clients mit dem server verbunden) wird dann empfangen und dekodiert, um die client-gui.
Dem Message-Objekt einen String-und die andere font-Informationen.
Mein problem ist, dass der server kein echo zurück, geben Sie die Nachricht Objekt. Ich habe das Gefühl, dass ich nicht Gießen richtig, aber an diesem Punkt bin ich nur zum Angeln mit dem Versuch verschiedene Dinge.
Die Idee ist, den server transparent vom Kunden - ist dies möglich, sprich: der server weiß nichts über die TestObject-Klasse? Gibt es eine Möglichkeit, um dieses?
Server-code:
import java.net.*;
import java.io.*;
public class Server
{
public SimpleServer() throws IOException, ClassNotFoundException
{
ServerSocket ss = new ServerSocket(4000);
Socket s = ss.accept();
ObjectInputStream ois = new ObjectInputStream(s.getInputStream());
ObjectOutputStream oos = new ObjectOutputStream(s.getOutputStream());
//the 'echo' functionality of the server
Object to = null;
try
{
to = ois.readObject();
}
catch (ClassNotFoundException e)
{
System.out.println("broke");
e.printStackTrace();
}
oos.writeObject(to);
oos.flush();
//close the connections
ois.close();
oos.close();
s.close();
ss.close();
}
public static void main(String args[]) throws IOException, ClassNotFoundException {
new SimpleServer();
}
}
Client-code:
import java.net.*;
import java.io.*;
public class Client
{
public SimpleClient() throws IOException, ClassNotFoundException
{
Socket s = new Socket( "localhost", 4000 );
ObjectOutputStream oos = new ObjectOutputStream(s.getOutputStream());
ObjectInputStream ois = new ObjectInputStream( s.getInputStream());
TestObject to = new TestObject( 1, "object from client" );
//print object contents
System.out.println( to );
oos.writeObject(to);
oos.flush();
Object received = ois.readObject();
//should match original object contents
System.out.println(received);
oos.close();
ois.close();
}
public static void main(String args[]) throws IOException, ClassNotFoundException
{
new SimpleClient();
}
}
class TestObject implements Serializable
{
int value ;
String id;
public TestObject( int v, String s )
{
this.value=v;
this.id=s;
}
@Override
public String toString()
{
return "value=" + value +
", id='" + id;
}
}
Vielen Dank für Ihre Zeit!
BEARBEITEN:
Dies ist die Ausgabe erzeugt:
Bekomme ich diese Meldung, wenn der client eine Verbindung zum server:
Exception in thread "main" java.lang.ClassNotFoundException: TestObject
- Und dies ist die client-Ausgabe, wenn ich den client ausführen:
Wert=1, id='Objekt vom client Exception in thread "main" java.net.SocketException: Connection reset
- Welchen output bekommen Sie?
- Ich bekomme diese Meldung, wenn der client eine Verbindung zum server: Exception in thread "main" java.lang.ClassNotFoundException: TestObject, Und dies ist die client-Ausgabe, wenn ich dem client ausgeführt werden: Wert=1, id='Objekt vom client Exception in thread "main" java.net.SocketException: Connection reset
Du musst angemeldet sein, um einen Kommentar abzugeben.
Erste :
TestObject
Klasse ist nicht sichtbar in Ihren Server-code. Das ist, warum es wirftClassNotFoundException
.Lösung : Setzen Sie Ihre
TestObject
Klasse in einer separaten Datei, und verwenden Sie dannimport
- Anweisung importieren. Klasse.Zweitens: Versuchen Sie, drucken Sie den Wert der empfangenen Objekt auf server-Seite. Und änderungen an Ihrem client-code wie unten
Sehe ich keine problem mit Ihrem code, außer Sie müssen Spülen Sie die
oos
stream nach dem schreiben Sie es in der server und client.Auch für die server transparent für den client, können Sie vermeiden, casting auf dem server ist(was Sie bereits tun) und der Endpunkt sollte sich sorgen über die
TestObject
was ist Ihr Kunde.Connection reset
ist aufgrund der sofort das schließen der Verbindung durch den server nach dem Lesen der Nachricht.