2013-08-25 133 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

你的logcat中有什么? –

回答

1

“新的DatagramSocket(...)”调用中的端口号看起来很奇怪。客户端应该创建一个“未绑定”套接字 - 只需使用“new DatagramSocket();”。发送者应绑定到客户端发送到的端口,即“新的DatagramSocket(4444);”。

+0

我认为你的意思是“接收者”应该绑定到“发件人”发送到的端口。 – AlastairG

0

源和目标端口号应该相同。在“DatagramSocket(xxx)”中给出相同的数字。两个程序中的xxx必须相同。

+0

几乎但不完全。发件人的端口绑定无关紧要。在上面的代码中,发送者正在发送到端口4444,并且接收者正在侦听端口80. 这些都不能解释为什么应用程序会在几秒钟后停止。接收机应该无限期地阻塞一个永远不会到达的数据包。除非有人指着它的网页浏览器... – AlastairG

2

在Android中你不能在UIThread(主线程)执行网络运营

要解决这个问题: 您的网络代码复制到一个新的线程,并让它运行。