当前位置: 动力学知识库 > 问答 > 编程问答 >

java me - Why I am getting the bad length exception when I am running this application?

问题描述:

I want to communicate to a server from J2me app using UDP.However, when I am running the app, I am getting a bad length exception.My codes and output are given below.

client code

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();

}

}

}

Server code

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);

}

}

}

Output at clientside

Starting run.... In run.... Bad

datagram length java.io.IOException:

Bad datagram length

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)

at javax.microedition.midlet.MIDletProxy.startApp(MIDletProxy.java:43)

at com.sun.midp.midlet.Scheduler.schedule(Scheduler.java:374)

at com.sun.midp.main.Main.runLocalClass(Main.java:466)

at com.sun.midp.main.Main.main(Main.java:120)

Stopping run....

Why I am getting this bad length exception and how do I sort it out?

网友答案:

One thing you need to try is to send and receive datagrams in a separate thread.

The documentation for DatagramConnection.receive() says: "This method blocks until a datagram is received"

You are calling it from inside MIDlet.startApp().

Blocking the application management system thread that calls startApp() is bad practice.

分享给朋友:
您可能感兴趣的文章:
随机阅读: