繁体   English   中英

来自服务器的UDP数据包如何接收? 对于android java

[英]how to Receive UDP packets, when it comes from server? for android java

我已经为UDP接收数据包使用了一个线程。 当我将数据包发送到该特定IP时,将在其中运行UDP接收程序。 不幸的是,该应用程序将被停止。 然后,如果我删除名为new Thread(new Runnable())并执行public void run则应用程序将运行良好,但是仅接收到一个数据。 我的意图是在数据到来时在接收器端连续接收数据。 请承认我。

udpserver.java:

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;


public class UdpServer extends Activity {
/** Called when the activity is first created. */
private TextView data;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    data = (TextView) findViewById(R.id.textView);

        runUdpServer();

}
private static final int UDP_SERVER_PORT = 11111;
private static final int MAX_UDP_DATAGRAM_LEN = 1500;
private void runUdpServer() {
    new Thread(new Runnable() {
        public void run() {
            String lText;
            byte[] lMsg = new byte[MAX_UDP_DATAGRAM_LEN];
            DatagramPacket dp = new DatagramPacket(lMsg, lMsg.length);
            DatagramSocket ds=null;
            try {
                 ds = new DatagramSocket(UDP_SERVER_PORT);
                //disable timeout for testing
                //ds.setSoTimeout(100000);
                ds.receive(dp);
                lText = new String(dp.getData());
                Log.i("UDP packet received", lText);
                data.setText(lText);
            } catch (SocketException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            finally {
                if (ds != null) {
                    ds.close();
                }
            }
        }
    }).start();
}

这是我用来接收和解析UDP数据包的有效代码段。

  try {
        int port = 11000;

        DatagramSocket dsocket = new DatagramSocket(port);
        byte[] buffer = new byte[2048];
        DatagramPacket packet = new DatagramPacket(buffer, buffer.length);

        while (true) {

            dsocket.receive(packet);
            lText = new String(buffer, 0, packet.getLength());
            Log.i("UDP packet received", lText);
            data.setText(lText);

            packet.setLength(buffer.length);
        }
    } catch (Exception e) {
        System.err.println(e);
        e.printStackTrace();
    }

您可以设置一个循环以从udp套接字读取数据。

try {
    ds = new DatagramSocket(UDP_SERVER_PORT);
    //disable timeout for testing
    //ds.setSoTimeout(100000);
    while (!ds.isClosed()) {
        ds.receive(dp);
        lText += new String(dp.getData());
        Log.i("UDP packet received", new String(dp.getData());
        runOnUiThread(new Runnable() {
            public void run() {
                data.setText(lText);
            }
        });
    }
} catch (SocketException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
} finally {
    if (ds != null) {
        ds.close();
    }
}

UPDATE :因为在非UI线程中接收到数据包数据。 在工作线程中直接访问data.setText(lText)是无效的。

try {
      DatagramSocket clientsocket=new DatagramSocket(9876);
      byte[] receivedata = new byte[1024];
      while(true)
      {
        DatagramPacket recv_packet = new DatagramPacket(receivedata, receivedata.length);
        Log.d("UDP", "S: Receiving...");
        clientsocket.receive(recv_packet);
        String rec_str = new String(recv_packet.getData());
        tv.setText(rec_str);
        Log.d(" Received String ",rec_str);
        InetAddress ipaddress = recv_packet.getAddress();
        int port = recv_packet.getPort();
        Log.d("IPAddress : ",ipaddress.toString());
        Log.d(" Port : ",Integer.toString(port));
      }
    } catch (Exception e) {
      Log.e("UDP", "S: Error", e);
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM