udpClient.Receive не получает UDP-дейтаграммы под MonoDroid + Simulator - PullRequest
0 голосов
/ 13 сентября 2011

Со следующим битом кода я не получаю UDP-дейтаграмму под MonoDroid + Simulator.Но тот же код хорошо работает под MonoTouch ...

Хорошо, я знаю, что нет гарантии, что один и тот же кусок кода работает одинаково на разных платформах.Но в конечном итоге это то, что я ожидаю от использования C # на iOS и Android.

 System.Threading.Thread udpListener = new System.Threading.Thread(() =>
 {
   System.Net.Sockets.UdpClient udpClient = new System.Net.Sockets.UdpClient(UDP_PORT);
   while (true)
   {
     try
     {
       System.Net.IPEndPoint sender = new System.Net.IPEndPoint(System.Net.IPAddress.Any, 0);
       byte[] bytes = udpClient.Receive(ref sender);
       using (System.IO.MemoryStream ms = new System.IO.MemoryStream(bytes))
       {
         System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(MyMessageList));
         MyMessageList messages = serializer.Deserialize(ms) as MyMessageList;
         if (messages != null) ParseNotificationMessages(messages);
       }
     }
     catch (System.Exception exp)
     {
     }
   }
 });
 udpListener.IsBackground = true;
 udpListener.Start();

Cheers, Patrick

Ответы [ 2 ]

1 голос
/ 28 сентября 2011

Не уверен, применимо ли это к монодроиду, но для общего тестирования Android с UDP вы должны проверить ответы на: Как получать данные с использованием UDP в Android?

Надеюсь, это поможет.

0 голосов
/ 24 сентября 2011

Odd;UDP должен работать, так как это один из наших тестов:

int Port = 9595;

var server = new UdpClient(Port);
server.BeginReceive(result => {
        IPEndPoint sender = null;
        var data = server.EndReceive(result, ref sender);
        var value = Encoding.Unicode.GetString (data);
        if (value != "hello there!")
            throw new InvalidOperationException ("UDP data transfer failed!");
        RunOnUiThread (() => textview.Text += "\n\nRead data from UDP: " + value);
        server.Close ();
}, null);

using (var client = new UdpClient()) {
    var bytes = Encoding.Unicode.GetBytes("hello there!");
    client.Send(
        bytes,
        bytes.Length,
        new IPEndPoint(IPAddress.Loopback, Port));
}

Теперь вышеприведенный код использует устройство с обратной связью вместо "реального" устройства, но я надеюсь / ожидаюэто на работу ...

С какого порта вы пытаетесь читать?Android действительно использует ядро ​​Linux, поэтому доступ к портам менее 1024 разрешен только авторизованным пользователям.

Другая возможность заключается в том, что вам не хватает разрешения android.permission.INTERNET, которое требуется для всех операций, связанных с сетью.

...