美文网首页Android进阶之路Android技术栈Android开发
基于UDP的网络数据传输测试(Java+Android)

基于UDP的网络数据传输测试(Java+Android)

作者: e4e52c116681 | 来源:发表于2018-10-07 17:44 被阅读5次

    零、前言

    1.本文不是大讲特讲UDP和TCP的区别,或者其流程,只是基于此作些小测试
    2.完成两个计算机、手机、计算机与手机之间的信息数据传输
    3.把控制台输出及GUI操作 以及Android展现形式
    4.既然都是Java,可以让计算机与Android端通信,在java的控制台上操作Android
    5.java控制台、java的GUI、Android界面都只是作为java的一种展现形式,任何一方都可以作为客户端或服务端

    1.java控制台与控制台测试
    udp发送与接收消息_控制台.png
    2.java的GUI测试
    udp发送与接收消息.png
    3.java控制台与安卓测试
    udp发送与接收消息android.png

    一、java控制台与控制台测试

    1:updSocket服务端:数据发送方

    思路

    1---建立updSocket服务。
    2---提供数据,并将数据封装到数据包中。
    3---通过socket服务的发送功能,将数据包发出去。
    4---关闭资源。
    
    public class UDPServer {
        public static void main(String[] args) {
            System.out.println("这是服务端");
            try {
                //1: 通过DatagramSocket对象创建updSocket服务:端口8081
                DatagramSocket datagramSocket = new DatagramSocket(8081);
                //2,确定数据,并封装成数据包。DatagramPacket(byte[] buf, int length, InetAddress address, int port)
                byte[] buf = "土豆土豆,我是地瓜".getBytes();
                DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getByName("192.168.56.1"), 8080);
                //3,通过socket服务,将已有的数据包发送出去。通过send方法。
                datagramSocket.send(dp);
                //4,关闭资源。
                datagramSocket.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    
    2:客户端:数据接收方

    思路

    1---定义udpSocket服务。通常会监听一个端口。(给网络应用定义数字标识--便于该应用程序处理传来数据过来)
    2---定义一个数据包,因为要存储接收到的字节数据(数据包对象中有更多功能可以提取字节数据中的不同数据信息)
    3---通过socket服务的receive方法将收到的数据存入已定义好的数据包中。
    4---通过数据包对象的特有功能。将这些不同的数据取出。打印在控制台上。
    5---关闭资源。
    
    class UDPClient {
        public static void main(String[] args) throws Exception {
            System.out.println("这是客户端");
            //1:创建udp socket,建立端点。
            DatagramSocket ds = new DatagramSocket(8080);
            while (true) {
                //2:定义数据包。用于存储数据。
                byte[] buf = new byte[1024];
                DatagramPacket dp = new DatagramPacket(buf, buf.length);
                //3:通过服务的receive方法将收到数据存入数据包中。
                ds.receive(dp);//阻塞式方法。
                //4:通过数据包的方法获取其中的数据。
                String ip = dp.getAddress().getHostAddress();
                String data = new String(dp.getData(), 0, dp.getLength());
                int port = dp.getPort();
                System.out.println("来自" + ip + ":" + port + ":" + data);
            }
            //5:关闭资源
            //ds.close();
        }
    }
    

    1.先打开客户端,然后程序由于ds.receive(dp);会进入等待
    2.打开服务端后,客户端会接收到服务端数据
    3.如果客户端在其他的电脑上,对应好IP和端口,也可以打印到其他电脑上

    udp发送与接收消息_控制台.png

    二、java的GUI测试

    控件是通过Idea拖拽的
    主要逻辑是不变的,只是在按钮点击时进行数据的发送文本框中的字符串,关闭窗口时关闭服务

    1:GUI实现服务端
    public class UDPServer {
        private JPanel mPanel1;
        private JButton mButton1;
        private JTextField mMsg;
        private DatagramSocket mDatagramSocket;
    
        public UDPServer() {
            mDatagramSocket = null;
            try {
                //1: 通过DatagramSocket对象创建updSocket服务
                mDatagramSocket = new DatagramSocket(8081);
            } catch (Exception e) {
                e.printStackTrace();
            }
    
            mButton1.addActionListener(e -> {
                //2,确定数据,并封装成数据包。DatagramPacket(byte[] buf, int length, InetAddress address, int port)
                byte[] buf = mMsg.getText().getBytes();
                DatagramPacket dp = null;
                try {
                    dp = new DatagramPacket(buf, buf.length, InetAddress.getByName("192.168.56.1"), 8080);
                    //3,通过socket服务,将已有的数据包发送出去。通过send方法。
                    mDatagramSocket.send(dp);
                } catch (Exception e1) {
                    e1.printStackTrace();
                }
            });
        }
    
        public void close() {
            //4,关闭资源。
            mDatagramSocket.close();
    
        }
    
        public static void main(String[] args) {
            JFrame frame = new JFrame("服务端");
            frame.setSize(400, 400);
            frame.setLocation(300, 200);
    
            UDPServer UDPServer = new UDPServer();
            frame.setContentPane(UDPServer.mPanel1);
            frame.addWindowListener(new WindowAdapter() {
                @Override
                public void windowClosing(WindowEvent e) {
                    UDPServer.close();
                }
            });
    
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true);
        }
    }
    
    2:GUI实现客户端
    public class UDPClient {
        private JPanel mPanel1;
        private JTextArea mTextArea1;
    
    
        public static void main(String[] args) {
            JFrame frame = new JFrame("客户端");
            frame.setSize(400, 400);
            frame.setLocation(300, 200);
    
            UDPClient client = new UDPClient();
            frame.setContentPane(client.mPanel1);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true);
    
            StringBuilder sb = new StringBuilder();
    
            //1:创建udp socket,建立端点。
            DatagramSocket ds = null;
            try {
                ds = new DatagramSocket(8080);
                while (true) {
                    //2:定义数据包。用于存储数据。
                    byte[] buf = new byte[1024];
                    DatagramPacket dp = new DatagramPacket(buf, buf.length);
                    //3:通过服务的receive方法将收到数据存入数据包中。
                    ds.receive(dp);//阻塞式方法。
                    //4:通过数据包的方法获取其中的数据。
                    String ip = dp.getAddress().getHostAddress();
                    String data = new String(dp.getData(), 0, dp.getLength());
                    int port = dp.getPort();
                    sb.append("来自" + ip + ":" + port + ":" + data+"\n");
                    client.mTextArea1.setText(sb.toString());
                    System.out.println(sb.toString());
                }
                //5:关闭资源
                //ds.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    
    udp发送与接收消息.png

    三、java控制台与Android

    在设置-->关于手机-->状态信息 中查看手机的ip(此处使用wifi测试)
    在服务端要写对应的ip。

    ip.png

    1.服务端的java代码:

    public class UDPServer2 {
        public static void main(String[] args) throws IOException {
            System.out.println("这是服务端");
            //1: 通过DatagramSocket对象创建updSocket服务:端口8081
            DatagramSocket datagramSocket = new DatagramSocket(8081);
    
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            String line = null;
            while ((line = br.readLine()) != null) {
                if ("886".equals(line)) {
                    break;
                }
                byte[] buf = line.getBytes();
                //2,确定数据,并封装成数据包。DatagramPacket(byte[] buf, int length, InetAddress address, int port)
                DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getByName("192.168.10.111"), 8080);
                //3,通过socket服务,将已有的数据包发送出去。通过send方法。
                datagramSocket.send(dp);
            }
            //4,关闭资源。
            datagramSocket.close();
        }
    }
    

    2.客户端的Android代码

    本示例并不需要网络权限!
    必须要在子线程接收数据,不然报异常,所以使用handler进行控件刷新

    public class MainActivity extends AppCompatActivity {
        private static final String TAG = "MainActivity";
    
        @BindView(R.id.id_tv_ip)
        TextView mIdTvIp;
    
        Handler mHandler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                String obj = (String) msg.obj;
                mSb.append(obj + " ");
                mIdTvIp.setText(mSb.toString());
            }
        };
        private StringBuffer mSb;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            ButterKnife.bind(this);
            
            mSb = new StringBuffer();
            
            new Thread() {
                @Override
                public void run() {
                    try {
                        //1:创建udp socket,建立端点。
                        DatagramSocket ds = new DatagramSocket(8080);
                        while (true) {
                            //2:定义数据包。用于存储数据。
                            byte[] buf = new byte[1024];
                            DatagramPacket dp = new DatagramPacket(buf, buf.length);
                            //3:通过服务的receive方法将收到数据存入数据包中。
                            ds.receive(dp);//阻塞式方法。
                            //4:通过数据包的方法获取其中的数据。
                            String data = new String(dp.getData(), 0, dp.getLength());
                            Message msg = Message.obtain();
                            msg.obj = data;
                            mHandler.sendMessage(msg);
                        }
                        //5:关闭资源
                        //ds.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }.start();
        }
    }
    
    udp发送与接收消息android.png

    如果你想要对网络传输有一点兴趣,不妨亲自试一下,用电脑控制手机或其他电脑的感觉还蛮不错的。好了,就酱紫。


    后记:捷文规范

    1.本文成长记录及勘误表
    项目源码 日期 备注
    V0.1--无 2018-10-2 基于UDP的网络数据传输测试(Java+Android)
    V0.2--无 - -
    2.更多关于我
    笔名 QQ 微信 爱好
    张风捷特烈 1981462002 zdl1994328 语言
    我的github 我的简书 我的CSDN 个人网站
    3.声明

    1----本文由张风捷特烈原创,转载请注明
    2----欢迎广大编程爱好者共同交流
    3----个人能力有限,如有不正之处欢迎大家批评指证,必定虚心改正
    4----看到这里,我在此感谢你的喜欢与支持

    相关文章

      网友评论

        本文标题:基于UDP的网络数据传输测试(Java+Android)

        本文链接:https://www.haomeiwen.com/subject/rwolaftx.html