Java me 为什么在运行此应用程序时会出现错误长度异常?

Java me 为什么在运行此应用程序时会出现错误长度异常?,java-me,udp,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 jav

我想使用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: 错误数据报长度 位于com.sun.midp.io.j2me.datagram.Protocol.receive(Protocol.java:367) 运行(DatagramTest.java:89) 在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) 停止运行


为什么会出现这种错误的长度异常以及如何解决它?

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

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

您正在从MIDlet.startApp()内部调用它


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

谢谢,我已经解决了这个问题。.问题是我之前初始化的数据包的长度。.但是,我也会尝试这个线程,因为它对我来说很有用。。