admin管理员组

文章数量:1637946

  1. 在onClick事件中编写UDP通讯程序包括发送和接收功能,注册事件监听器
public class udpActivity extends AppCompatActivity {

    private Button button;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_udp);
        button=findViewById(R.id.button);
        setListener();//注册监听器
        Log.v("test1","start");

    }
    private void setListener(){
        udpActivity.OnClick onClick = new udpActivity.OnClick();
        //对每一个按钮进行setOnClickListener
        button.setOnClickListener(onClick);}
    private class OnClick implements View.OnClickListener{
        @Override
        public void onClick(View v) {
            new Thread(new Runnable(){
                @Override
                public void run() {
            Log.v("test1","start");
            // 1.定义服务器的地址、端口号、数据
                    DatagramSocket socket=null;
            try {
                Log.v("test1","debug");
                InetAddress address = InetAddress.getByName("10.0.2.2");
                Log.v("test1","debug2");
                int port=1024;
                byte[] data ="abcdefg" .getBytes();
                Log.v("test1",address.toString());
                //创建数据报,包含发送的数据信息
                DatagramPacket packet=new DatagramPacket(data,data.length,address,port);
                Log.v("test1","debug3");
                //创建DatagramSocket对象
                int ports=4567;
                socket=new DatagramSocket(ports);
                Log.v("test1","debug4");
                //向服务器端发送数据报
                socket.send(packet);
                Log.v("test1","debug5");
                /*
                 *接受服务器端响应的数据
                 */
                //创建数据报,用于接收服务器端响应的数据
                byte[] data2=new byte[1024];

                DatagramPacket packet2=new DatagramPacket(data2,data2.length);
                //接收服务器响应的数据
                socket.receive(packet2);
                //读取数据
                String reply=new String(data2,0,packet2.getLength());
                Log.v("test1","我是客户端,服务器说:" +reply);
                //关闭资源

            } catch (Exception e) {e.printStackTrace();
            } finally {
                socket.close();
                Log.v("test1","end");
            } }
            }).start();
        }
    }
 }
  1. 如上所示,安卓4.0以上版本,主线程中不能运行网络连接程序,建议写法启动一条子线程执行任务。

  2. 在AndroidManifest.xml中添加网络权限

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  1. 此时可以实现udp数据发送到PC端,但是无法接收PC端数据,注意安卓虚拟机访问本机地址IP为10.0.2.2而不是127.0.0.1,故应将信息发送到地址10.0.2.2,此时本机PC端可以得到信息。

https://blog.csdn/qq_22705681/article/details/85991602
https://blog.csdn/zengmingen/article/details/53783037

  1. 虚拟机接收数据需要先进行端口映射,打开windows的telnet服务

    在控制台中输入telnet localhost 5554,其中5554位虚拟机端口,进入android console


执行redir add udp:4567:4567
其中,第一个端口号是PC的端口,第二个端口号是模拟器端口。(端口映射)
如上图所示,在执行该命令前需先输入 auth命令 在第四行所给出的路径中找到auth_token并按格式输入。
6. 此时PC端软件向127.0.0.1的4567端口发送信息,安卓虚拟机可以的得到相应信息,注意设置数据发送和接收格式。

本文标签: 虚拟机PCudp