专栏首页Android知识点总结基于UDP的网络数据传输测试(Java+Android)

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

零、前言

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----看到这里,我在此感谢你的喜欢与支持

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 不允许对64位应用程序进行修改”的解决方法

    在64位系统中使用VS对程序(32位的)进行调试,出现“不允许对64位应用程序进行修改”的提示,如下图所示:

    跟着阿笨一起玩NET
  • 关于调用Web服务引用方式不同的问题

    跟着阿笨一起玩NET
  • 一个 IT 青年北漂四年的感悟

    工作这几年,每年都会有朋友离开北京,每次朋友跟我告别的时候总是让我有很多感慨,问自己什么时候回去。当初毕业来北京没想太多,只是出于对互联网的喜欢,而在老家又找不...

    哲洛不闹
  • 作为一个程序员我最大的遗憾

    20多年前我处在了人生的一个十字路口。随着我们用5年时间为出版社(他们希望进入新兴的互联网空间)打造的Deltagraph的终结,我的第二家公司逐渐走向没落。那...

    哲洛不闹
  • 爱因斯坦的光线

    宇相
  • YYYY-mm-dd HH:MM:SS

    跟着阿笨一起玩NET
  • 《麦肯锡 问题分析与解决技巧》——阅读笔记(共16章)

    《麦肯锡 问题分析与解决技巧》是一本关于问题分析与如何解决问题的书籍,在阅读过程中收获不少,因此留下读书笔记方便其他人来进行学习。

    黄Java
  • Image.FromFile 锁文件的解决办法

    跟着阿笨一起玩NET
  • 熬夜并不值得程序员炫耀

    放弃睡眠就像是高利贷借款。没错,看上去你是得到了额外的时间,但你想得太乐观了,你知道代价是什么吗?放高利贷的会回来讨债,到时如果你不能支付的话,他就会夺走你的创...

    哲洛不闹
  • 自由程序员的3个开发技巧

    我们有三个系列的小技巧要分享:与你的客户沟通,保护你的声誉以及解决常见的自由职业问题。下面让我们开始吧!

    哲洛不闹

扫码关注云+社区

领取腾讯云代金券