为什么我在运行此应用程序时遇到错误的长度异常?

时间:2011-01-17 21:38:10

标签: java-me udp

我想使用UDP从J2me应用程序与服务器进行通信。但是,当我运行应用程序时,我遇到了一个错误的长度异常。我的代码和输出如下所示。

客户端代码

import javax.microedition.midlet.MIDlet;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.TextBox;
import javax.microedition.lcdui.TextField;
import javax.microedition.io.Connector;
import javax.microedition.io.Datagram;
import javax.microedition.io.DatagramConnection;
import java.io.IOException;

public class DatagramTest extends MIDlet
implements CommandListener, Runnable
{
private static final int BUF_SIZE = 1024;
private static Command exit = new Command("Exit", Command.EXIT, 1);
private static DatagramTest instance;
private Display display;
private TextBox dgramText;

private DatagramConnection conn;

private Datagram dgram;

private String address = "datagram://myip:9876";


public DatagramTest()
{
super();
instance = this;
}


public DatagramTest(String service)
{
this();
address = service;
}
/**
Returns the single instance of this class. Calling
this method before constructing an object will return
a null pointer.
@return an instance of this class.
*/
public static DatagramTest getInstance()
{
return instance;
}
public void startApp()
{
display = Display.getDisplay(this);
dgramText = new TextBox("Datagram contents",
null,
2048,
TextField.ANY);
dgramText.setCommandListener(this);
display.setCurrent(dgramText);
System.out.println("Starting run....");
run();
System.out.println("Stopping run....");
}


public void run()
{
     System.out.println("In run....");
try
{
int maxLength;

conn = (DatagramConnection)Connector.open(address);
maxLength = conn.getMaximumLength();
dgram = conn.newDatagram(1024);

dgram.reset();

conn.send(dgram);

conn.receive(dgram);

byte[] data = dgram.getData();
// Extract the response string.
String str = new String(data);

System.out.println(str);

dgram.reset();
System.out.println("Exit run....");

}
catch (IOException ioe)
{
System.out.println(ioe.getMessage());
ioe.printStackTrace();
quit();
}
return;
}
public void pauseApp()
{
}
void quit()
{
destroyApp(true);
notifyDestroyed();
}
public void destroyApp(boolean destroy)
{
try
{
conn.close();
}
catch (IOException ioe)
{
ioe.printStackTrace();
}
}
public void display()
{
Display.getDisplay(this).setCurrent(dgramText);
}
public void commandAction(Command c, Displayable d)
{
if (c == exit)
{
quit();
}
}
}

服务器代码

import java.io.*;
import java.net.*;

class UDPServer
{
   public static void main(String args[]) throws Exception
      {
         DatagramSocket serverSocket = new DatagramSocket(9876);
            byte[] receiveData = new byte[1024];
            byte[] sendData = new byte[1024];
            while(true)
               {
                  DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
                  serverSocket.receive(receivePacket);
                  String sentence = new String( receivePacket.getData());
                  System.out.println("RECEIVED: " + sentence);
                  InetAddress IPAddress = receivePacket.getAddress();
                  int port = receivePacket.getPort();
                  String capitalizedSentence = sentence.toUpperCase();
                  sendData = capitalizedSentence.getBytes();
                  DatagramPacket sendPacket =
                  new DatagramPacket(sendData, sendData.length, IPAddress, port);
                  serverSocket.send(sendPacket);
               }
      }
}

在客户端输出

  

开始跑......跑步......坏   数据报长度java.io.IOException:   数据报长度不好           at com.sun.midp.io.j2me.datagram.Protocol.receive(Protocol.java:367)           at hello.DatagramTest.run(DatagramTest.java:89)           at hello.DatagramTest.startApp(DatagramTest.java:69)           在javax.microedition.midlet.MIDletProxy.startApp(MIDletProxy.java:43)           在com.sun.midp.midlet.Scheduler.schedule(Scheduler.java:374)           在com.sun.midp.main.Main.runLocalClass(Main.java:466)           在com.sun.midp.main.Main.main(Main.java:120)   停止运行....

为什么我会收到这个错误的长度异常,我该如何解决它?

1 个答案:

答案 0 :(得分:2)

您需要尝试的一件事是在单独的线程中发送和接收数据报。

DatagramConnection.receive()的文档说:“此方法会一直阻塞,直到收到数据报”

您是从MIDlet.startApp()内部调用它。

阻止调用startApp()的应用程序管理系统线程是不好的做法。