Java - UDP通过socket发送数据..不是rec。所有数据

时间:2012-03-06 18:43:28

标签: java sockets networking inputstream

似乎我编写的Client-Server应用程序确实有效,但似乎并非每次都处理所有数据。

我正在Eclipse env。

的本地机器上测试它

服务器:

    private void sendData() throws Exception
{
    DatagramPacket data = new DatagramPacket(outgoingData, outgoingData.length, clientAddress, clientPort);
    InputStream fis = new FileInputStream(responseData);

    int a;
    while((a = fis.read(outgoingData,0,512)) != -1)
    {
        serverSocket.send(data);
    }
}

客户端:

    private void receiveData() throws Exception
{
    DatagramPacket receiveData = new DatagramPacket(incomingData, incomingData.length);
    OutputStream fos = new FileOutputStream(new File("1"+data));
    while(true)
    {
        clientSocket.receive(receiveData);
        fos.write(incomingData);
    }
}

我曾经在while(true)循环中使用if else来检查数据包长度是否小于512字节,因此它知道何时中断;

我当时觉得有一个问题,但是现在好像是oke我等了几分钟然后停止了Client.java应用程序

文件传输但是原始文件是852kb,到目前为止我有777,800,850,...但是从来没有全部。

2 个答案:

答案 0 :(得分:1)

您的方法的根本问题是UDP不保证传递。如果 使用UDP(而不是TCP),则必须实现一种方案,该方案将检测并处理丢失,无序到达或多次传送的数据包。

请参阅When is it appropriate to use UDP instead of TCP?

答案 1 :(得分:0)

您应该使用TCP来传输文件。您可能正在丢失数据包,因为您在循环时发送速度非常快。

int a;
while((a = fis.read(outgoingData,0,512)) != -1)
{
   serverSocket.send(data);
}
由于你的发送速度如此之快,我非常怀疑它是否有机会以正确的顺序接收。一些数据包也可能因此丢失。

此外,由于您发送的固定大小为512字节,因此您发送的最后一个数据包可能不是那么大,因此您会看到文件的结尾“看起来很奇怪。”