套接字无法完成发送4Byte数据包

时间:2013-10-18 21:16:19

标签: java sockets loops udp filestream

这更像是之前提出的问题的后续问题,但我现在已经修改了原始代码,能够通过具有特定数据包大小的UDP套接字发送文件而不是文本。如果我指定1,2或4字节数据包,程序运行完美,但是如果我尝试更大的数据包,例如8,16等,程序就会停止运行。控制台中没有异常,但Netbeans在右下角显示一个小警告符号,并显示以下内容。

java.lang.IllegalArgumentException: Contents must be presorted - added value 42318 is less   than preceding value 42320
at org.netbeans.core.output2.IntList.add(IntList.java:76)
at org.netbeans.core.output2.AbstractLines.addTabAt(AbstractLines.java:1122)
at org.netbeans.core.output2.OutWriter.doWrite(OutWriter.java:452)
at org.netbeans.core.output2.OutWriter.write(OutWriter.java:506)
at java.io.PrintWriter.write(PrintWriter.java:456)
at java.io.PrintWriter.write(PrintWriter.java:473)
at org.apache.tools.ant.module.bridge.impl.ForkedJavaOverride$Copier.maybeFlush(ForkedJavaOverride.java:350)
at org.apache.tools.ant.module.bridge.impl.ForkedJavaOverride$Copier.access$000(ForkedJavaOverride.java:251)
at org.apache.tools.ant.module.bridge.impl.ForkedJavaOverride$Copier$1.run(ForkedJavaOverride.java:271)
at org.openide.util.RequestProcessor$Task.run(RequestProcessor.java:1432)
[catch] at org.openide.util.RequestProcessor$Processor.run(RequestProcessor.java:2044)

是否由于UDP数据包被无序接收而抛出此错误?有没有办法忽略这个?我可以告诉程序已经停止,因为“The End”字符串没有出现。有谁知道为什么会这样?我的客户端套接字的代码附在下面(它有点长而且很多评论都是为了我自己的理智)。非常感谢任何指导。

public class UDPClient extends variable {

// static Integer portNo = 4444; 

static Integer byteSize = 16;

public static void main(String[] args) throws Exception { //taken out main from here
    SocketForm form = new SocketForm();
    File file=null;

  long startTime; // Starting time of program, in milliseconds.
  long endTime;   // Time when computations are done, in milliseconds.
  double time;  

    //get server address
    String serverName = "localhost";

    if (args.length >= 1)
        serverName = args[0];
  InetAddress serverIPAddress = InetAddress.getByName(serverName);

    //get server port;
    int serverPort = form.cliportNo;
    if (args.length >= 2)
        serverPort = Integer.parseInt(args[1]);
    //create socket
    DatagramSocket clientSocket = new DatagramSocket();
    //get input from keybaord
    byte[] sendData = new byte[byteSize];
    //BufferedReader inFromUser = new BufferedReader(new InputStreamReader (System.in));
    //while (true){
    //String sentence = inFromUser.readLine();
    startTime = System.currentTimeMillis();
    //sendData = sentence.getBytes();

    String fileName = "/Users/Andrew/Desktop/pic.jpg";
    File f = new File(fileName);

    FileInputStream fis = null;
    try {
        fis = new FileInputStream(f);
        System.out.println("Total file size to read in bytes is : " + fis.available());

    } catch (IOException e) {}


Path path = Paths.get("/Users/Andrew/Desktop/pic.jpg");
//byte[] data = Fles.readAllBytes(path);
sendData = Files.readAllBytes(path);   

    try {
    for( int index = 0; index < sendData.length ; index += byteSize ) {
     DatagramPacket packet = new DatagramPacket( sendData, index, Math.min( byteSize, sendData.length-index ), serverIPAddress, serverPort);
     clientSocket.send(packet);
    //DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, serverIPAddress, serverPort);

    //receive datagram
    byte[] receiveData = new byte [byteSize];

    DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
    clientSocket.receive(receivePacket);
    //print output
    String sentenceFromServer = new String(receivePacket.getData());
    System.out.println("From Server:" + sentenceFromServer);
    }
    System.out.println("The End");
    }
    catch (Exception e) {}
    //close client socket
            //clientSocket.close();
        endTime = System.currentTimeMillis();
  time = endTime - startTime;
      System.out.println("Time :" + time);
   // }

} //end of main

} //end of UDPClient

1 个答案:

答案 0 :(得分:0)

解决。运行7.3的Netbeans。这是7.3中的一个已知问题,已在7.4的最新版本中得到解决。解决方案:更新到Netbeans 7.4。现在像猫一样咕噜咕噜感谢所有试图帮助的人!