我试图通过UDP从客户端发送数据包到服务器。 我面临的问题是,如果最后一个数据包大小小于我们正在读取的字节数组的大小,那么来自前一个数据包的冗余数据将被附加到它。 我尝试只将最后一个数据包的正确部分复制到一个新的字节数组然后发送它,但客户端以某种方式仅发送错误的数据包。 任何人都可以指出我做错了什么。 提前致谢。

Client.java:

class client
{
static int serverPort;
static String filename;
    public static void main(String args[]) throws SocketException, IOException
    {
        int count=0;
        int MAX_SIZE = 1048;

        DatagramSocket clientSocket = new DatagramSocket();
        InetAddress IpAddress = InetAddress.getByName("localhost");

        byte[] sendData = new byte[MAX_SIZE];

        String filePath = "C:\\in.txt";
        File file = new File(filePath);
        FileInputStream fis = new FileInputStream(file);


        int totLength = 0; 

        while((count = fis.read(sendData)) != -1)    //calculate total length of file
        {
            totLength += count;
        }

        System.out.println("Total Length :" + totLength);

        int noOfPackets = totLength/MAX_SIZE;
        System.out.println("No of packets : " + noOfPackets);

        int off = noOfPackets * MAX_SIZE;  //calculate offset. it total length of file is 1048 and array size is 1000 den starting position of last packet is 1001. this value is stored in off.

        int lastPackLen = totLength - off;
        System.out.println("\nLast packet Length : " + lastPackLen);

        byte[] lastPack = new byte[lastPackLen-1];  //create new array without redundant information


        fis.close();

        FileInputStream fis1 = new FileInputStream(file);
        //while((count = fis1.read(sendData)) != -1 && (noOfPackets!=0))
        while((count = fis1.read(sendData)) != -1 )
        { 
            if(noOfPackets<=0)
                break;
            System.out.println(new String(sendData));
            DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IpAddress, 9876);
            clientSocket.send(sendPacket);
            System.out.println("========");
            System.out.println("last pack sent" + sendPacket);
        noOfPackets--;
        }

        //check
        System.out.println("\nlast packet\n");
        System.out.println(new String(sendData));

        lastPack = Arrays.copyOf(sendData, lastPackLen);

        System.out.println("\nActual last packet\n");
        System.out.println(new String(lastPack));
                //send the correct packet now. but this packet is not being send. 
        DatagramPacket sendPacket1 = new DatagramPacket(lastPack, lastPack.length, IpAddress,     9876);
        clientSocket.send(sendPacket1);
        System.out.println("last pack sent" + sendPacket1);

    }
}

Server.java:
import java.io.*;
import java.net.*;

class server
{
    public static void main(String args[]) throws IOException
    {
        DatagramSocket serverSocket = new DatagramSocket(9876);
        byte[] recData = new byte[1024];
        int i =0;

        FileWriter file = new FileWriter("C:\\Users\\ayushi\\Documents\\Semester 2\\Misc\\setups\\eclipse\\ip_1\\ip_second\\src\\out.txt");
        PrintWriter out = new PrintWriter(file);


        //BufferedOutputStream bos = new BufferedOutputStream(fos);

        while(true)
        {
            //PrintWriter out = new PrintWriter(file);

            DatagramPacket recPacket = new DatagramPacket(recData, recData.length);
            serverSocket.receive(recPacket);
            String line = new String(recPacket.getData());
            System.out.println("\n Data: " + line);
            out.println(line);
            System.out.println("\nPacket" + ++i + " written to file\n");
            out.flush();
        }
    }
}

===============>>#1 票数:2 已采纳

如果最后一个数据包大小小于我们正在读取的字节数组的大小,那么来自前一个数据包的冗余数据将被附加到它。

不会。问题是来自第一个数据包的字节仍然包含在recData字节数组中。 随后的读取随后用第二个数据包的内容覆盖字节数组的开头,但是数组的其余部分仍然填充有来自第一个数据包的数据。

根本问题是您忽略了实际接收的字节数。 您还应该使用FileOutputStream ,而不是Writer 尝试这个:

class Server
{
    public static void main(String args[]) throws IOException
    {
        ...

        while(true)
        {
            DatagramPacket recPacket = new DatagramPacket(recData, recData.length);
            serverSocket.receive(recPacket);
            System.out.println("\n Packet length: " + recPacket.getLength());
            out.write((recPacket.getData(), 0, recPacket.getLength());
            System.out.println("\nPacket" + ++i + " written to file\n");
            out.flush();
        }
    }
}

  ask by clever_bassi translate from so

未解决问题?本站智能推荐:

1回复

使用UDP在服务器和客户端之间进行文件传输(.png,.txt)

我写了一个服务器和客户端,供客户端连接到服务器,并从服务器目录中选择一个数据以使用UDP协议传输数据,但问题是,它仅适用于.txt文件,不适用于.png文件并且在.txt文件中,输出文件与原始文件也不相同,例如单词之间没有一行,所有单词并排打印,而不是逐行打印。 我该如何解决这个问题?
1回复

客户端服务器udp套接字

嗨,我有一个不起作用的udp客户端服务器代码,我问一个普遍的问题“是个好孩子吗”,两个代码都没有出现错误,但是当我运行代码时,它输出DatagramPacket sendPacket = new DatagramPacket(sendData,sendData。长度,IPAddress,9876
1回复

UDP游戏服务器/客户端

我正在尝试进行一场坦克比赛,而网络部分出现了问题。 我在服务器上做错了什么? 这是我的服务器代码: 这是我的客户代码: 我正在调用这样的代码: 感谢您的帮助!
1回复

java-udp编程 - 从服务器到客户端的消息

我正确地在服务器和客户端之间建立连接,我从客户端向服务器发送消息,但是如何从服务器向客户端发送消息。我的意思是如何让服务器像客户端一样行动。我试图将客户端方法复制到服务器可以调用的另一个类。但我不能然后我尝试创建一个新的包来使用服务器类中的客户端代码。任何建议? ps:抱歉我的英文。
1回复

Java UDP服务器-客户端显示方形字符

我使用了一个在这里找到的UDP服务器/客户端的示例: http : //systembash.com/content/a-simple-java-udp-server-and-udp-client/ 客户端向服务器发送一个字符串,服务器将小写字母更改为大写字母。 服务器: 客
1回复

我有一个UDP服务器和客户端,现在如何让它们连续发送/接收?

因此,正如简短标题所述,我有一个UDP服务器和客户端。 服务器目前有3种方法,一种是打开套接字并接收数据包。 下一个读取数据包并打印信息。 最终用户根据用户输入创建响应包。 我将在此处包含服务器代码,因为我认为如果我可以在使服务器能够发送和接收消息方面获得帮助,那么我也可以将新知识转
1回复

1个服务器2个客户端Java

我想用2个玩家制作一个游戏。我将使用udp服务器和2个客户端,但我不知道如何将2个客户端同时连接到1个服务器以及它们如何通信。 我将只使用java。最后鼠标单击如何与服务器同步 服务器
2回复

如何获得多个(UDP)客户端以仅接收来自特定服务器的数据包?

我正在创建一个接口,其中多个客户端向服务器(存储它们的所有地址)定期发送更新,然后服务器向所有客户端发送包含所有客户端更新的数据包。 看起来一切正常,但是当我同时运行服务器和客户端时,出现此错误: 它所涉及的行是(在客户端中): 服务器打开套接字,如下所示: 注意:我正
1回复

Udp服务器太慢了?

因此,我正在做一个MMO,我正在进步很多,6个月编程这个东西。 问题是我正在测试离线我的游戏,今天我有一个绝妙的想法,移植我的服务器并使其在线,我知道它会稍微慢一点,但它可怕! 太滞后!!! 游戏无法播放。 我像这样管理我的数据包.... 玩家想要向上移动,客户端将movePack
1回复

Java将udp数据包发送到dns服务器

我正在尝试将udp数据包发送到指定的DNS服务器并从dns服务器接收响应。 问题是我不会从服务器得到响应。 我尝试使用我的客户端套接字接收数据包,但没有任何成功。 寻求帮助来解决这个问题。 这是我的UdpClient.java