Почему я получаю исключение неправильной длины при запуске этого приложения? - PullRequest
1 голос
/ 18 января 2011

Я хочу связаться с сервером из приложения J2me, используя UDP. Однако, когда я запускаю приложение, я получаю исключение неправильной длины. Мои коды и выходные данные приведены ниже.

код клиента

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) 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 Ответ

2 голосов
/ 18 января 2011

Одна вещь, которую вам нужно попробовать, это отправлять и получать дейтаграммы в отдельном потоке.

Документация для DatagramConnection.receive () гласит: «Этот метод блокируется до получения дейтаграммы»

Вы вызываете его изнутри MIDlet.startApp ().

Блокировка потока системы управления приложениями, который вызывает startApp (), является плохой практикой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...