2011-01-17 4 views
1

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.Pr otocol.receive (Protocol.java:367) at hello.DatagramTest.run (DatagramTest.java:89) at hello.DatagramTest.startApp (DatagramTest.java:69) at javax.microedition.midlet.MIDletProxy.startApp (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) 중지 실행 ....

왜이 나쁜 길이 예외를 얻고이며 어떻게 그것을 밖으로 정렬합니까?

답변

2

당신이 시도해야 할 한 가지는 별도의 스레드에서 데이터 그램을 보내고받는 것입니다.

DatagramConnection.receive에 대한 문서()는 말한다 : 당신은가 MIDlet.startApp 내부에서 호출하는

"데이터 그램 때까지이 메소드를 수신"().

startApp()를 호출하는 응용 프로그램 관리 시스템 스레드를 차단하는 것은 좋지 않습니다.

+0

감사합니다. 문제를 해결할 수있었습니다. 문제는 이전에 초기화 한 패킷의 길이였습니다. 그러나 나에게 유용하기 때문에 문제는 스레드를 시도 할 것입니다. –

관련 문제