Socket TCP/IP ObjectOutputStream

javamarc

Neues Mitglied
Hallo zusammen

Bei meinem aktuellen Projekt (Netzwerk Spiel) geht es darum über TCP/IP ein Objekt zu senden.

Server und Client funktionieren soweit. Das heisst es wird eine Verbindung aufgebut und es können auch bereits Objekte gesendet bzw. empfangen werden.

Das Problem ist aber, dass nur das erste gesendete Objekt "richtig" gesendet/empfangen wird. Die nächsten Objekte (selbes Objekt wie Vorher nur mit geänderter y-Variabel) werden aber beim Server wieder wie das erste gesendete Objekt empfangen (also die y-Variabel bleibt unverändert).

Durch Debuggen habe ich bereits folgendes herausgefunden:
- Die y-Valiabel ändert sich vor jedem senden.
- Das Objekt wird der sende-Funktion korrekt übergeben
- Wenn anstatt meinem Objekt ein String gesendet wird und dieser auch ständig ändert funktioniert es, auch der Server empfängt dann alle Strings.

Nun somit gehe ich davon aus, dass bei meiner sende-Funktion etwas schief läuft.

Hier meine Klassen:

Server (funktioniert aus meiner Sicht, ist einfach hier, falls es relevant sein sollte zum nachvollziehen)

Java:
import java.io.*;
import java.net.*;
import java.util.ArrayList;


/*****************************************************************************
* Class:         Server                                                         *
*****************************************************************************/

public class Server implements Runnable
{
    private static final Integer STATE_INIT = 0;
    private static final Integer STATE_PLAY = 1;
    static final long serialVersionUID = 1;
    public static ArrayList<Socket> sockets = new ArrayList<Socket>();
    private Integer port;
    private InetAddress adr;
    private String ip;
    private Connection connection;
    private Thread thread;
 
    private Integer state;
 
    Server(String port)
    {
        this.port = Integer.parseInt(port);
        try {
            this.adr = InetAddress.getLocalHost();
            this.ip = adr.getHostAddress();
        } catch (UnknownHostException e) {
            System.out.println("Server: could not create Server @" + ip);
            e.printStackTrace();
        }
     
        thread = new Thread(this);
        thread.start();
    } // end constructor
 
    public Connection getConnection()
    {
        return this.connection;
    }

@Override
public void run() {
    System.out.println("Server: created @" + ip);
    try
    {
        // ServerSocket generieren
        ServerSocket echod = new ServerSocket(port);
        Socket sock = echod.accept();
     
        sockets.add(sock);
        System.out.println("Server: Client " + sock.getLocalAddress().getHostName()+" connected");
     
        connection = new Connection(sock,true);
        Thread X = new Thread(connection);
        X.start();
     
    }
 
 
    catch( IOException e)
    {
        System.err.println( e.toString() );
        System.exit(1);
    } 
 
}     
} // end class Server

Connection (Hier vermute ich das Problem. Entweder Im run beim empfangen oder im sendWorm)

Java:
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

public class Connection implements Runnable{
 
    private Socket sock;
    private Boolean ServerClient;
    private ObjectOutputStream oos;
    private ObjectInputStream ois;
    //private Worm worm;
    private String cmd;
    //private Shot shot;
 
    Connection(Socket sock, Boolean Server)
    {
        this.sock = sock;
        this.ServerClient = Server;
        try {
            if(Server)
            {
                oos = new ObjectOutputStream(sock.getOutputStream());
                ois = new ObjectInputStream(sock.getInputStream());
            }
            else
            {
                ois = new ObjectInputStream(sock.getInputStream());
                oos = new ObjectOutputStream(sock.getOutputStream());
            }
         
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
 
    public Boolean CheckConnection()
    {
        if(!sock.isConnected())
        {
            System.out.println("Connection: Nok");
            return false;
        }
        else
        {
            System.out.println("Connection: ok");
            return true;
        }
         
    }
 
    public void sendWorm(Worm _worm)
    {
        if(sock.isConnected())
        {
            try {
                oos.writeObject(_worm);
                oos.flush();
                System.out.println("Client: sent worm");
            } catch (IOException e) {
                System.out.println("Client: error sending worm");
                e.printStackTrace();
            }
        }
        else
        {
            Server.sockets.remove(this.getMyPos());
            this.closeConnection();
        }
         
     
    }
 
    private Integer getMyPos()
    {
        //Get Position of sockets arraylist
        for(int i = 1; i <= Server.sockets.size(); i++)
        {
            if(Server.sockets.get(i)==sock)
            {
                return i;
            }
        }
     
        return -1;
    }

 
    public void closeConnection()
       { 
        try
           {                     
            sock.close();
           }
     
           catch ( IOException e )
          {
               System.err.println( e.toString() );
           }
             
   }


    @Override
    public void run() {
     
        try
        {
            try
            {
                System.out.println("Server/Client: running...");
                while(true)
                {
                    if(CheckConnection())
                    {
                        Object o = ois.readObject();
                        if(o instanceof Worm)
                        {
                            //Server
                            if(ServerClient)
                            {
                                Colision.updateWorm(((Worm) o));
                  
                                System.out.println("-------------------");
                                System.out.println("ID: "+ ((Worm) o).getId());
                                System.out.println("X:  "+ ((Worm) o).getPosx());
                                System.out.println("Y:  "+ ((Worm) o).getPosy());
                            }
                        }
                        else if(o instanceof String)
                        {
                            System.out.println((String)o);
                        }
                    }
                }
            }
            finally
            {
                //sock.close();
            }
        }
        catch(Exception e)
        {
            System.out.println(e);
        }
     
    }

}

Client (funktioniert auch...)
Java:
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;


/*****************************************************************************
* Class:         Client                                                         *
*****************************************************************************/

public class Client
{
    static final long serialVersionUID = 1;

    private int port;
    private String remoteIP;
    private Socket sock;
    private Connection connection;

    public Client(String port, String remoteIP)
    {
        this.port        = Integer.parseInt(port);
        this.remoteIP     = remoteIP;
        System.out.println("Client: created");
    } // end constructor
 
    public void connect()
    {
        try {
            sock = new Socket(remoteIP, port);
            System.out.println("Client: connected to "+ remoteIP);
        }catch (IOException e) {
            e.printStackTrace();
            System.out.println("Client: server "+ remoteIP + " not responding");
        }
     
        connection = new Connection(sock,false);
        Thread X = new Thread(connection);
        X.start();
    }
 
    public Connection getConnection()
    {
        return connection;
    }

 

} // end class Client

Ausschnitt aus Main (sendet alle 500ms den Wurm)
(hier könnte auch ein Problem sein bei der übergabe des Objekts.)
Java:
while(true){
            try {
                Worm wormi = Colision.worms.get(0);
                System.out.println("-------------------");
                System.out.println("ID: "+ wormi.getId());
                System.out.println("X:  "+ wormi.getPosx());
                System.out.println("Y:  "+ wormi.getPosy());
                System.out.println("-------------------");
                if(!(win.connection == null))
                {
                    win.connection.sendWorm(wormi);
                }
                Thread.sleep(500);
             
            }
            catch (InterruptedException ie) {}
            //win.update();
        }

Ich hoffe ich habe nichts vergessen. Ich freue mich auf konstruktive Rückmeldungen und eventuelle Tipps, welche zur Lösung des Problems beitragen. :)

Freundliche Grüsse
Marc
 
Zuletzt bearbeitet:

dayaftereh

Top Contributor
Hey, versuche mal:

Java:
public void writeUnshared(Object obj);

Die Klasse ObjectOutputStream hat einen Object Referenz Graph und verschickt das selbe Object immer nur einmal, obwohl es sich geändert hat.

Schau mal in der API...

Vielleicht hilft das ;)
 

Ähnliche Java Themen


Oben