1

だから私はJavaサーバーとクライアントを持っています。データはサーバーに正常に送信され、サーバーはそれを処理していますが、サーバーが送信したものにクライアントが応答するのに時間がかかることがわかりました。サーバーがクライアントに送信しているデータが、送信すべきデータよりもはるかに長いということです。

クライアントに送信されたパケットには、送信したすべてのデータが含まれていますが、その後にも多くの空白があります。これを修正したいのですが、何かアイデアはありますか?

データを取得するための私のコードは、サーバー上のすべてのクライアントの単純な for ループです。これにより、クライアント データが文字列に追加され、その文字列がパケットに追加されます。

クラス PlayerList

public static String getString()
{
    String message = "";

    for(int x = 0; x < list.size(); x++)
    {
        Player player = list.get(x);

        if(message.equals(""))
        {
            message += player.name+";"+player.address+";"+player.pos[0]+";"+player.pos[1]+";"+player.fakeRotation+";"+player.rotation+";"+player.rotationSpeed+";"+player.speed+";"+player.sheildEnabled+";"+player.sheildStrength+";"+player.health;
        }
        else
        {
            message += ","+player.name+";"+player.address+";"+player.pos[0]+";"+player.pos[1]+";"+player.fakeRotation+";"+player.rotation+";"+player.rotationSpeed+";"+player.speed+";"+player.sheildEnabled+";"+player.sheildStrength+";"+player.health;
        }
    }

    System.out.println(message);

    return message;
}

クラス送信

while(Server.serverRunning)
    {
        for(int p = 0; p < PlayerList.list.size(); p++)
        {
            Player player = PlayerList.list.get(p);

            try
            {
                byte[] buf = PlayerList.getString().getBytes();

                //send the message to the client to the given address and port
                packet = new DatagramPacket(buf, buf.length, player.address);
                Server.socket.send(packet);
            }
            catch (IOException e)
            {
                System.out.println("Can't send packet to player: "+player.name);
            }
        }
    }

getString メソッドから受け取ったデータは正しく、テストしたところ空白がないことがわかっているので、パケットに文字列を追加すると空白が発生するはずです。

意図したデータは、次のように出力に表示されます。 Luke;127.0.0.1:63090;50.0;50.0;0.0;0.0;0.0;0.0;true;100;100

ただし、実際のデータはクライアントに次のように表示されます。 Luke;127.0.0.1:63090;50.0;50.0;0.0;0.0;0.0;0.0;true;100;100 (lots of spaces here) ...line is too long, please switch to wrapped mode to see whole line...

データを受信するクライアント コードは次のとおりです。

receiveData = new byte[clientSocket.getReceiveBufferSize()];
                receivePacket = new DatagramPacket(receiveData, receiveData.length);
                clientSocket.receive(receivePacket);
                receiveMessage = new String(receivePacket.getData());
4

1 に答える 1

5

DatagramPacketのgetDataは、バッファ全体を返します。これには、最後に余分なデータが含まれる場合があります。getLength()を呼び出して、受信したデータの実際の長さを判別し、getData()からそれらのバイトのみを確認する必要があります。

byte[] realData = Arrays.copyOf( receivePacket.getData(), receivePacket.getLength() );
于 2012-06-05T14:33:47.183 に答える