zoukankan      html  css  js  c++  java
  • 使用UDP实现数据的发送和接收

    1.UDP是无连接到不可靠的一种传输方式,只负责发送而不管接收方是否接收到,所以效率也高一点(牺牲安全追求效率案例)

    2.实现发送和接收的具体实现

    //客户端类

    public class Client{

      //先抛异常,抓重点

      public static void main (String []args)throws Exception{

        //建立发送端

        DatagramSocket client=nwe DatagramSocket();

        //数据都是通过"包"来发送的

        //包内有4个参数,byte数组 数组长度 发送地址 发送的端口号

        //计算机很呆,必须要告诉它发什么,发给谁,想象成写信(email),如上图,我们写完正文再写地址,文章就发送过去了

        //通过String类的getByte()方法把字符串变成byte数组(这里可以用Scanner来手动输入内容,有互动性更有趣)

        byte[] buf="内容".getByte();

        int length=buf.length;

        //取得本机的地址(因为是自己发给自己),也可以改成别的你知道的数据库的ip地址,至于它能不能收到就不好说了,毕竟这是一种不可靠的传输

        InetAddress ia=InetAddress.getByName("localhost");

        //这个随便写,但是尽量不要写三位数,容易和其他软件产生冲突

        int port=5678;

        //打包准备发货

        DatagramPacket dp=new DatagramPacket(buf,length,ia,port);

        //发货

        client.send(dp);

        //可以输出一句提示语,表示发货了

        System.out.println("数据已经发送了");

        //记得关门~

        client.close();

      }

    }

    //服务器类(不要把服务器类和客户端写在一起)

      public class Server{

        //抓主要,直接抛异常

        public static void main (String[]args)throws Exception{

          //这是服务器端,要提前声明好端口,因为要先开启,必须先抢占一个地盘

          //由于我们先写客户端,为了保持一致,所以端口号也是5678(虽然看起来是先有客户端5678,但根源是先有服务器的5678)

          int port=5678;

          DatagramSocket server=new DatagramSocket(port);

          //发送端送来的是个"包裹",咱们也得用包裹去接,用多大的包裹呢,一般情况下1024个字节就够了吧,在客户端我们做一点限制防止装不下导致数据丢失

          //(微博的140字限制)  结合现实,我们只需要接收方的包裹给2个数据(数组,及数组长度即可).

          byte[]buf=new byte[1024];

          int length=buf.length;

          DatagramPacket dp=new DatagramPacket(buf,length);

          //准备好了,来接收吧

          server.receive(dp);

          //确认一下收到了啥玩意,得到dp的数据,从0薅到尾      

          String str=new String(dp.getData(),0,dp.length);

          //如果接收到了吱一声

          System.out.println(str);

          //记得关门是个好习惯

          server.close();

      }

    }

     以上就是UDP的单次传输方式

        

    二 怎么多次才能使用呢?

      循环!那循环多少次呢?不知道?那就选while吧.

      怎么改呢,只要把客户端服务器的代码写在while里面就可以了

      设置一个信号,如果不想循环了,就启动信号,break出去.

      现实生活中服务器是不关的,可以不用写close();

    三.以上是一对一哎,咱们不可能专门为一个人写一个服务器(土豪除外)

      于是用到了多线程

      回想一下创建线程有哪些方法啊?可以继承Thread类,可以通过实现Runnable接口.

      那就随便选一个吧,使用Runnable接口

      客户端线程外面就长成这个样子

      public class ClientThread implements Runnable{

        @override

        public void run(){

         //这里是线程执行的代码,你希望这个线程做什么全往这招呼,于是我们不客气的使用了CV大法,把之前写的客户端主体复制粘贴过来了

          ----------

         //不同的是这个host(端口)不要写死,给大家一点自由,咋整啊...构造方法站了起来

         //于是把端口作为私有的属性,给发一个公有地构造方法,当调用的时候就可以给端口设定值了 

        

        }

    }

        //可以了,应该建一个Test类验收一下了

       public class ServerTest{

        public static void main(String []args){

          //先建服务器端线程类对象

          ServerThread st=new ServerThread(5678);

          //由于它是实现Runnable接口,自己没东西,所以要找代理

          Thread t=new Thread(ct);

          t.start();

          }

      }  

          //在建一个客户发送端

     public class ClientTest{

        public static void main(String []args){

          //三行不好看,可以试着合为一句,好处是不用想名字了

          new Thread(new ServerThread(5678)).start();

          }

      }  

      //注意,写在线程里的代码是实现了Runnable接口,但是Runnable接口没有抛异常,所以线程也不能在方法声明处抛异常了,只能用try-catch自己写异常了QAQ

      //其实也简单,代码全写在try里,catch判断异常类型,不会就写Exception

      //完结撒花

  • 相关阅读:
    vue简单总结
    浅拷贝 与递归实现深拷贝封装
    利用mock生成随机的东西
    你不知道的JavaScript--面向对象高级程序设计
    超实用的JavaScript代码段 --倒计时效果
    超实用的JavaScript代码段 Item4 --发送短信验证码
    WEB前端性能优化:HTML,CSS,JS和服务器端优化
    超实用的JavaScript代码段 Item8 -- js对象的(深)拷贝
    web开发必须知道的javascripat工具
    加快页面的运行速度
  • 原文地址:https://www.cnblogs.com/waibangma/p/11142947.html
Copyright © 2011-2022 走看看