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
//完结撒花