2010-01-20 37 views
5

Mã dưới đây dẫn đến thời gian chờ.Android không bao giờ nhận gói UDP

Nó hoạt động tốt trên Java không phải của Android. Có chuyện gì vậy?

//@Override 
public static void run() 
{ 
    //System.out.println ("Local Machine IP : "+addrStr.toString () ) ; 
    HelloWorldActivity.tv.setText("Trace 1"); 

    try 
    { 
     // Retrieve the ServerName 
     InetAddress serverAddr; //= InetAddress.getByName(Server.SERVERIP); 
     InetAddress ias[] = InetAddress.getAllByName(Server.SERVERNAME); 
     serverAddr = ias[0]; 

     Log.d("UDP", "C: Connecting..."); 
     /* Create new UDP-Socket */ 
     DatagramSocket socket = new DatagramSocket(); 

     /* Prepare some data to be sent. */ 
     String strQuery="ÿÿÿÿgetservers"+" "+Server.iProtocol+" "+"'all'"; 
     Log.d("UDP", strQuery); 
     //byte[] buf = ("ÿÿÿÿgetservers 68 'all'").getBytes(); 
     byte[] buf = strQuery.getBytes(); 

     /* Create UDP-packet with 
     * data & destination(url+port) */ 
     DatagramPacket packet = new DatagramPacket(buf, buf.length, 
                serverAddr, Server.SERVERPORT); 

     Log.d("UDP", "C: Sending: '" + new String(buf) + "'"); 

     /* Send out the packet */ 
     socket.setSoTimeout(5000); 
     socket.send(packet); 
     Log.d("UDP", "C: Sent."); 
     Log.d("UDP", "C: Done."); 

     // http://code.google.com/p/android/issues/detail?id=2917 

     byte[] buffer= new byte[1024*100]; 
     DatagramPacket receivePacket 
      = new DatagramPacket(buffer, 
           buffer.length); //, serverAddr, Server.SERVERPORT); 
     socket.receive(receivePacket); 
     HelloWorldActivity.tv.setText("TTT"); 

     String x = new String(receivePacket.getData()); 
     Log.d("UDP", "C: Received: '" + x + "'"); 
     HelloWorldActivity.tv.setText(x); 

    } catch (Exception e) { 
     HelloWorldActivity.tv.setText(e.getMessage()); 
     Log.e("UDP", "C: Error", e); 
    } 
} 


public class Server 
{ 
    /* 
    //public static java.lang.string SERVERIP; 
    public static String SERVERNAME = "monster.idsoftware.com"; 
    public static String SERVERIP = "192.246.40.56"; 
    public static int SERVERPORT = 27950; 
    public static int PROTOCOL = 68; 
     */ 

    //public static String SERVERNAME="monster.idsoftware.com"; 
    public static String SERVERNAME="dpmaster.deathmask.net"; 

    public static String SERVERIP="192.246.40.56"; 
    public static int SERVERPORT=27950; 
    //public static int iProtocol= 68; // Quake3 
    public static int iProtocol=71; // OpenArena 

} 

manifest Android:

<?xml version="1.0" encoding="utf-8"?> 

<use-permission id="android.permission.READ_CONTACTS" /> 

    <use-permission android:name="android.permission.WRITE_SETTINGS" /> 
    <uses-permission android:name="android.permission.READ_CONTACTS" /> 
    <uses-permission android:name="android.permission.CALL_PHONE" /> 
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
    <uses-permission android:name="android.permission.ACCESS_GPS" /> 
    <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" /> 
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
    <uses-permission android:name="android.permission.ACCESS_LOCATION" /> 
    <uses-permission android:name="android.permission.ACCESS_ASSISTED_GPS" /> 
    <uses-permission android:name="android.permission.ACCESS_CELL_ID" /> 

    <uses-permission android:name="android.permission.RECEIVE_SMS" /> 
    <uses-permission android:name="android.permission.VIBRATE" /> 
    <uses-permission android:name="android.permission.WAKE_LOCK" /> 

<application 
     android:icon="@drawable/icon" 
     android:label="AAA New Application" 
     > 
    <activity android:name="HelloWorldActivity"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN"/> 
      <category android:name="android.intent.category.LAUNCHER"/> 
     </intent-filter> 
    </activity> 
</application> 

+0

Bạn có chắc chắn rằng nhà khai thác mạng di động của bạn cho phép lưu lượng truy cập UDP không giới hạn không? – jarnbjo

+0

Sẽ không thể chơi Quake3 trên android (qua usb) trên tàu nếu điều đó không đúng. –

Trả lời

7

Bạn đang thử nghiệm này trên giả lập hoặc trên một điện thoại thực tế? Nếu bạn đang sử dụng trình mô phỏng, bạn cần phải biết về how networking on the emulator works. Cụ thể nhất:

Mỗi trường hợp trình giả lập chạy ẩn sau thiết lập và giao diện mạng của máy phát triển của bạn và từ internet. Một thiết bị mô phỏng không thể thấy máy phát triển của bạn hoặc các thể hiện mô phỏng khác trên mạng. Thay vào đó, nó chỉ thấy rằng nó được kết nối thông qua Ethernet với một bộ định tuyến/tường lửa.

Có thể bạn sẽ cần thiết lập cổng chuyển tiếp, using the Emulator console hoặc using the adb command.

+0

nó không thành công trên thiết bị thực tế, quá ... nó luôn luôn timeouts, trong giả lập cũng như trong các thiết bị thực tế. Nó hoạt động tốt trên máy phát triển trong một môi trường java bình thường. Và tôi có thể truy cập internet trên android ... –

1
byte[] buf = new byte[256]; 
socket = new DatagramSocket(port); 
DatagramPacket packet = new DatagramPacket(buf, buf.length); 
socket.receive(packet); 

Làm việc trên cho tôi ... Bộ đệm của bạn có vẻ lớn?


Có thể hơi xa vời nhưng bạn đang cố gắng nhận gì?

Nếu bạn đang cố gắng liên lạc với máy XP có hai card mạng (có thể có dây và không dây khác, bất kỳ kết hợp nào) và bạn đang sử dụng tường lửa tích hợp sẵn của XP?

Sau đó, yêu cầu UDP chỉ được nghe trên mạng đầu tiên trên máy tính, vô hiệu hóa các thẻ mạng khác trên hệ thống của bạn, chỉ kích hoạt thẻ mà bạn đang cố gắng nói thiết bị Android của mình.

+0

lớn? 1024 * 100 = 100 kb. Đó không phải là nhiều. Tôi cũng đã thử trên Android trực tiếp, không phải trình giả lập, nhưng kết quả tương tự ở đó. Tuy nhiên, tôi sẽ thử với 256 byte. –

+0

Lưu ý nhận xét của jarnbjo mã mẫu ở trên đã hoạt động với thiết bị của tôi được kết nối qua WiFi không qua mạng di động. – optics

+0

Tôi sẽ thử rằng khi tôi trở về nhà và có wifi –

2

UDP hoạt động tốt. Tôi không nghĩ rằng máy chủ của bạn đang gửi một phản ứng vì gói gửi đi của bạn không chứa các byte mà bạn nghĩ rằng nó chứa.

xem nhận xét của tôi trong lỗi android mà bạn đã nêu ra (http://code.google.com/p/android/issues/detail?id=6163).

+0

điều gì sẽ xảy ra nếu nhận được nhưng trong các luồng dữ liệu liên tục, một số gói bị bỏ qua. Bất kỳ ý tưởng nào để giải quyết vấn đề đó –

0

Để gửi/phát sóng UDP sử dụng socket.send(), bạn cần sự cho phép android:

<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" /> 

Tuy nhiên, ngay cả như vậy, socket.receive() dường như không nắm bắt được phát sóng, ngay cả khi chạy trong cùng một ngữ cảnh. Tôi tự hỏi liệu có sự cho phép khác đối với socket.receive()? ...

Các vấn đề liên quan