2013-08-25 2 views
1

У меня есть два класса, один класс отправителя, а другой - класс приемника. Оба приложения отправки и приема останавливаются через несколько секунд и закрываются. Мой класс отправитель:отправка и прием пакета UDP в сокете датаграммы в android

public class MainActivity extends Activity { 
InetAddress receiverAddress; 
DatagramSocket datagramSocket; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 


    try { 
     datagramSocket = new DatagramSocket(4444); 
    } catch (SocketException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } 

    byte[] buffer = "".getBytes(); 
    byte[] address="192.168.1.101".getBytes(); 

    try { 
     receiverAddress = InetAddress.getByAddress(address); 
    } catch (UnknownHostException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } 

    DatagramPacket packet = new DatagramPacket(
      buffer, buffer.length, receiverAddress, 4444); 

    try { 
     datagramSocket.send(packet); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 




} 

Мой приемный или прослушивания класс:

public class MainActivity extends Activity { 
DatagramSocket datagramSocket; 
DatagramPacket packet; 
TextView tv1; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    tv1=(TextView)findViewById(R.id.textView1); 
    try { 
     datagramSocket = new DatagramSocket(80); 
    } catch (SocketException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } 

    byte[] buffer = new byte[10]; 
    packet = new DatagramPacket(buffer, buffer.length); 

    try { 
     datagramSocket.receive(packet); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    byte[] buff = packet.getData(); 

tv1.setText(buff.toString()); 

} 

Заранее спасибо за помощь.

+1

Я думаю, что вам нужно запускать эти транзакции дейтаграмм в отдельном потоке или новом потоке, хотя я не уверен, что это только решит ваши проблемы. – kabuto178

+0

Что находится в вашем логарифме? –

ответ

1

Номера портов в «новых вызовах DatagramSocket (...)» выглядят странно. Клиент должен создать «несвязанный» сокет - просто используйте «новый DatagramSocket();». Отправитель должен привязываться к порту, который отправляет клиент, т. Е. «Новый DatagramSocket (4444);».

+0

Я думаю, вы имеете в виду, что «приемник» должен привязываться к порту, отправленному «отправителем». – AlastairG

0

Номер порта источника и порта назначения должен быть таким же. Дайте одинаковые номера в «DatagramSocket (xxx)». xxx должно быть одинаковым в обеих программах.

+0

Почти, но не совсем. Связывание порта отправителя не имеет значения. В приведенном выше коде отправитель отправляет на порт 4444, и приемник прослушивает порт 80. Ничего из этого не объясняет, почему приложения останавливаются через несколько секунд. Приемник должен блокировать бесконечное ожидание пакета, который никогда не прибывает. Если кто-то не укажет на него веб-браузер ... – AlastairG

2

В Android вы не разрешается выполнять операции сети на UIThread (Main-Thread)

исправить это: Скопируйте сети-код на новую тему и дайте ему поработать.

Смежные вопросы