使用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

  //完结撒花

猜你喜欢

转载自www.cnblogs.com/waibangma/p/11142947.html