Socket Datenübertragung nur mit Verzögerung (TCP/UDP)

MrDLink

Mitglied
Hallo erstmal,
ich sitze hier grade vor dem Problem, dass mein Server-Client Programm nur mit Verzögerung funktioniert.
Zum Detail: Ich habe ein kleines Spiel programmiert, wobei jeder Client ueber einen Server gesteuert wird. Die Verbindung wird mittels Socket hergestellt. Das Problem ist nur, dass der Client nur mit ca. 1sek Verzögerung reagiert.
Ich habe auch schon meherere Varianten probiert, einmal ueber TCP also normalen Socket, einmal über UDP also DatagrammSocket und momentan läuft die Anmeldung und erstmaliges Übermitteln von Daten über eine TCP-Verbindung und weitere Updates über eine UDP-Verbindung.

Woran kann das liegen? Falls Ihr weitere Angaben braucht, einfach bescheid sagen.

Über hilfreiche Antworten würde ich mich sehr freuen.
 

MrDLink

Mitglied
Eigentlich geht es um die Datenübertragung während das Spiel läuft, also die DatagrammSocket-Verbindung.

Client Output:
Java:
public class CTcpOutputTask extends Thread{

    private DataOutputStream out;
    private KeyBindings keyBindings;

   
private void sendUpdate() throws IOException{     
     boolean[] userinput = keyBindings.getUserInput();
     for(int i = 0; i < userinput.length; i++)
       out.writeBoolean(userinput[i]);
     out.writeDouble(keyBindings.getMouseLocation()[0]);
     out.writeDouble(keyBindings.getMouseLocation()[1]);
     out.flush();   
   }

Client Input:
Java:
public class CUdpInputTask extends Thread{

    private DatagramSocket socketUDP;
    private Client client;
    private int bufferSize = 65536;   
    private short key;
   

    public CUdpInputTask( DatagramSocket socketUDP, Client client ) {
        this.socketUDP = socketUDP;
        this.client = client;       
    }
   
    private void update() throws ClassNotFoundException, IOException {       
        if( !client.isLoading() ){
           
            ByteBuffer byteBuffer = receivePacket();   
            key = byteBuffer.getShort();
           
        }
    }

Server Output:
Java:
public class UserOutputTask extends Thread{

    private Server server;
    private InetAddress address;
    private int port;
    private ByteArrayOutputStream outToByte = new ByteArrayOutputStream();
    private DataOutputStream outUDP = new DataOutputStream(outToByte);
    private DataOutputStream outTCP;

private void sendSectionUpdate() throws IOException{       
        //send key for this packet 0 = enemies update
        outUDP.writeShort(0);
                ... //Daten werden geladen
        sendUdpPacket();
}

private void sendUdpPacket() throws IOException{
        outUDP.flush();
        outToByte.flush();
        byte[] data = outToByte.toByteArray();
        DatagramPacket packet = new DatagramPacket(data, data.length, address, port);
        server.sendUpdate(packet);
        outToByte.reset();
    }
 
K

kneitzel

Gast
Ähm - du rufst in sendUdpPacket() flush VOR dem senden eines Paketes? Wenn, dann würde ich es nach dem senden des Paketes aufrufen, damit eben die geschriebenen Daten nicht noch im Buffer stecken. Und ich meine, dass flush nur auf dem obersten der Streams aufgerufen werden muss, da dies auf den drunter liegenden Streams automatisch flush aufruft.
 

MrDLink

Mitglied
flush() schreibt doch aber die Daten endgültig aus dem Buffer und stellt damit sicher, dass auch tatsächlich alles im byte[] data reingeschrieben wird.
 
K

kneitzel

Gast
Ach - hab mich verschaut - klar. Die sind ja nur dazu da, dass du das byte Array bekommst.

Kannst Du noch zeigen, was hinter server.sendUpdate steckt und was noch im client steckt?
 

MrDLink

Mitglied
Java:
public synchronized void sendUpdate( DatagramPacket packet ){
        try {
            serverSocketUDP.send(packet);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
 

Ähnliche Java Themen


Oben