2012-09-09 69 views
2

我使用數據報協議爲使用客戶端 - 服務器交互的手機(使用j2me)編寫簡單的應用程序。移動應用程序將一些文本發送到服務器,服務器將該文本打印到標準輸出。下面是發送數據報(與移動電話)的代碼:用j2me發送數據報

String ip; 
String port; 
String msg; 
//Loading ip, port and msg from the user input, I won't write it here, 'cause it 
//does not matter 

//Below is a simple code snippet for sending msg to the ip:port address 
connection = (DatagramConnection) Connector.open(
     "datagram://" + ip + ":" + port); 

Datagram datagram = connection.newDatagram(msg.getBytes(), 
      msg.getBytes().length); 
connection.send(datagram); 

下面是用於接收數據報(與PC)的代碼:

DatagramSocket s = new DatagramSocket(7777);   
DatagramPacket p = new DatagramPacket(new byte[1024], 1024); 

s.receive(p); 
System.out.println(new String(p.getData())); 

所以,當我推出第一碼片段(用於發送數據報)使用模擬器,一切工作正常:服務器成功接收和打印數據報。但是當從移動電話發送數據報的程序時,數據報不會到達服務器。

當通過仿真器測試程序時,IP地址是我的本地網絡IP,當通過真實的手機測試時,IP取自http://www.whatismyip.com/。在模擬器測試中使用以前的IP時,數據報也不會到達服務器。 端口始終設置爲7777.

那麼,我可以解決這個問題嗎?

+0

在手機上測試時,您是否觀察到任何異常?另外,它是否支持數據報?根據MIDP 2規範,該協議是可選的 – gnat

+0

不,根本沒有例外 –

回答

1

您的服務器必須有真正的公共IP才能到達。如果它位於代理/防火牆之後,那麼Java ME應用程序將無法訪問它。

如果可能,嘗試在某些虛擬化服務(Amazon,Google等)上託管您的服務器。

+0

但是似乎我擁有公共IP ...或者像whatismyip.com這樣的服務不保證我擁有公共IP?我通過本地網絡連接到互聯網...... –

+0

我在工作時從我的局域網輸入了whatismyip.com,它給了我兩個地址:一個用於代理服務器,另一個用於「檢測到本地網絡IP」。我再次在終端(Linux)上使用ifconfig進行檢查,並且該網站顯示了正確的值。 –