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)
Connection (Hier vermute ich das Problem. Entweder Im run beim empfangen oder im sendWorm)
Client (funktioniert auch...)
Ausschnitt aus Main (sendet alle 500ms den Wurm)
(hier könnte auch ein Problem sein bei der übergabe des Objekts.)
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
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: