2011-03-02 37 views
4

我是新來的Android和Java都讓我請你原諒,如果我的問題 被要求在不恰當的組或論壇。我做了一個淨 申請我公司,最近他們要求我將它移植上 的Android以便在三星Galaxy標籤安裝。首先,我使用Eclipse,JDK 6,目標平臺android 2.2 以及帶有GalaxyTab插件的模擬器。我的操作系統是Windows 7.DatagramSocket.bind();套接字異常:無法分配請求的地址。 Android模擬器

本申請,發送和接收消息,並且從某種 控制器使用UDP在網絡上。 簡而言之,我的應用程序使用「DatagramSocket」,將其綁定到本地 「InetSocketAddress」,然後啓動線程來偵聽 數據報,而另一個線程根據用戶請求向控制器發送請求。下面是一些代碼片段:

這是我給你的本地地址和插座:

try { 
    loc_addr = new InetSocketAddress(
     Inet4Address.getByAddress(
       new byte[]{(byte) 192,(byte) 168,1,(byte)240}), 0xBAC0); 
     //192.168.1.240 is the IP of my machine on the network 
} catch (UnknownHostException e) { 
    ....... 
} 
try { 
    soc = new DatagramSocket(); 
    soc.setReuseAddress(true); 
    soc.setBroadcast(true); 
    soc.bind(loc_addr); 
} catch (SocketException e) { 
    ....... 
} 

這是我聽傳入的數據報:

try{ 
    buf = new byte[1024]; 
    receive_pac = new DatagramPacket(buf, 1024); 
    soc.receive(receive_pac); 
    if (receive_pac.getData() != null){ 
    ....... 
    } 
} 

這是我發送數據:

try { 
    addr = (Inet4Address) Inet4Address.getByAddress (new byte[] 
{(byte) 192,(byte) 168,1,(byte) 255}); //The message I am sending should be broadcasted 
} catch (UnknownHostException e) { 
    ...... 
} 
sendPacket = new DatagramPacket(buf, buf.length, addr, 
loc_addr.getPort()); 
try { 
    soc.send(sendPacket); 
} catch (IOException e) { 
    ...... 
} 

那麼當我使用「soc.bind(...)」我收到以下異常: 不能分配請求的地址

然後我收到一個調試消息(我不知道這是否是相關的):

DEBUG/SntpClient(58): request time failed: java.net.SocketException: Address family not supported by protocol 

該應用程序的工作,我通過「Wireshark的」,當我 請覈實從仿真器將數據發送到控制器,該控制器 回覆回來了正確的預期數據。然而, 插座,在應用程序中,在模擬器上沒有收到任何東西,並保持阻塞 「接收」呼!

誰能幫我找出問題或錯誤我與我的應用程序的接收部分承諾!

任何幫助是非常讚賞,

回答

0

通常你看到錯誤消息,如果你想綁定到你不擁有一個IP地址。你確定你的Android模擬器的IP地址是192.168.1.240嗎?仿真器IP可能與您的主機IP不同。

+1

謝謝你傑夫的幫助,併爲您的信息。 我搜索了一下,發現鏈接上有一些代碼:http://www.droidnova.com/get-the-ip-address-of-your-device,304.html,它允許我找到模擬器的IP正如你所說的,與我的電腦的IP非常不同。 我試着將它綁定到套接字,並導致「SocketException:無效的參數」。該程序仍然提供相同的操作!你有什麼想法這個例外可能意味着什麼? – TMI 2011-03-05 08:25:22

+0

@TMI不太確定這次可能是什麼。但它看起來像你[不是唯一一個有這個問題](http://stackoverflow.com/questions/4163375/debug-sntpclient60-request-time-failed-java-net-socketexception-address-fami) – Jeff 2011-03-06 07:44:51

8

TMI,

[編輯:如果你看到我的其他答案,請無視,我做了一個測試改變兩個變量的典型的錯誤,它是由區別的其他變量]

關於此問題:

我嘗試將它綁定到套接字,並導致「SocketException:Invalid Argument」。該程序仍然提供相同的操作!你有什麼想法這個例外可能意味着什麼?

你現在可能已經解決了這個問題,但我只是有同樣的問題,自己回答here

對我來說擺脫了這個異常是改變了我創建DatagramSocket的方式。

來源:

sock = new DatagramSocket(); 

要:

DatagramChannel channel = DatagramChannel.open(); 
DatagramSocket socket = channel.socket(); 
+0

感謝一堆爲此,你救了我:-)。我發現它更容易,但使用InetAddress.getByAddress(「192.168.1.240」); – Andy 2011-10-12 19:49:45

+0

我也爲你提到的問題添加了一個答案(現在偶然發現了這個問題);基本上正確的解決方案是通過DatagramSocket(SocketAddress localAddr)構造函數創建一個未綁定的套接字,只是將null作爲參數傳遞。有關詳細信息,請參閱您在參考的問題中的答案。 – Newtron 2016-03-03 22:16:41

相關問題