使用UDP实现数据的发送和接收

1.UDP是无链接到不可靠的一种传输方式,只负责发送而无论接收方是否接收到,因此效率也高一点(牺牲安全追求效率案例)数据库

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

 

//客户端类安全

public class Client{服务器

  //先抛异常,抓重点多线程

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

    //创建发送端线程

    DatagramSocket client=nwe DatagramSocket();代理

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

    //包内有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

  //完结撒花

相关文章
相关标签/搜索