美文网首页
Java网络编程之UDP网络通信

Java网络编程之UDP网络通信

作者: 征程_Journey | 来源:发表于2017-05-21 11:28 被阅读0次

    1      网络编程----UDPNo25

    【Scanner scanner =new Scanner(System.in);

    try {

    DatagramSockets = newDatagramSocket(8888);

    String line =scanner.nextLine();

    byte[] bytes =line.getBytes();//把用户输入的字符串拆成字节数组

    //把字节数组塞进包里,写上对方的地址和端口

    try {

    DatagramPacketp = new DatagramPacket(bytes, bytes.length,

    InetAddress.getByName("127.0.0.1"),9999);

    s.send(p);//发送包裹

    s.close();

    scanner.close();

    DatagramSockets = new DatagramSocket(9999);

    byte[] bytes = newbyte[1024];

    DatagramPacket p =new DatagramPacket(bytes, bytes.length);//准备空包

    s.receive(p);//接收,空包裹被填满

    String str = newString(bytes,0,p.getLength()); //用字节数组的有效数据组装回字符串

    System.out.println(str);

    s.close();

    2:bytes

    DatagramSocket s =new DatagramSocket(9999);

    byte[] bytes = newbyte[128];//用于存放接收数据的数组

    //用于存放接收数据的空数据报包,字节数组放置其中

    DatagramPacket p =new DatagramPacket(bytes, bytes.length);

    s.receive(p);//接收其他收发站发来的数据,阻塞方法,收到才返回

    for(int i=0;i

    System.out.println(bytes[i]);  //下标为0,1,2,3

    }

    s.close();//关闭收发站

    DatagramSocket s =new DatagramSocket(8888);//在8888上建立收发站

    byte[] bytes = { 1,2, 3 };//要发送的数据

    //建立一个包,把要发送的数据塞进去,写上对方的地址和端口9999

    DatagramPacket p =new DatagramPacket(bytes, bytes.length,

    InetAddress.getByName("127.0.0.1"),9999);

    s.send(p);

    s.close();//关闭收发站

    UDP UserDatagram Protocol用户数据报协议

    也是传输层的一个协议,信息传输时不需要连接,不可靠,效率较高

    1.1    Java进行UDP通信

    Java进行UDP通信:

    DatagramSocket相当于一个收发站(信息发送站)

    构造方法:DatagramSocket(int port)在port端口上建立收发站

    send(DatagramPacketp)发送数据报包

    receive(DatagramPacketp)接受数据报包,阻塞方法,一旦收到对象发过来的包,这个DatagramPacket中的存放数据的字节数组就会自动填充对方发过来的信息

    DatagramPacket数据报包,收发站要进行收发的包(信息接收站)

    构造方法:

    一、发送的包:

    DatagramPacket(byte[]bytes,int len,InetAddress addr,int port)第一个参数表示字节数组形式的发送数据,第二个参数是包的长度,一般是字节数组的长度,第三个参数是接收方的地址,第四个参数接收方的端口)

    二、接收的包:

    DatagramPacket(byte[]bytes,int len)

    第一个参数是存放接收数据的数组,第二个是接收数据的长度

    getLength()获取包的有效长度

    InetAddress.getByName(Stringaddress)根据字符串生成一个地址对象

    getAddress()获得一个InetAddress对象,表示发送方地址,再调用这个对象的getHostAddress()获取字符串形式的地址

    int getPort()获取端口号

    1.2    网络编程实战UDP

    DatagramSocket类:《此类表示用来发送和接收数据报包的套接字;特点:既能发送又能接收》

    DatagramPacket类:《此类表示数据报包。数据报包用来实现无连接包投递服务。每条报文仅根据该包中包含的信息从一台机器路由到另一台机器。》

    使用步骤:【发送端:《1、创建套接字对象     2、封装数据报包

    3、发送数据报包       4、释放资源》

    【接收端:《1、创建套接字对象     2、创建数据报包,用于接收数据

    1、 通过receive方法接收数据并保存到数据报包中  4、释放资源》

    示例代码:

    发送端《

    publicclass SendDemo {

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

    // UDP的发送端

    System.out.println("UDP发送端开启.....");

    // 创建Socket对象

    DatagramSocket socket = newDatagramSocket();

    // 创建数据报包

    byte[] buf = "来自udp发送端的数据".getBytes();

    DatagramPacket packet = newDatagramPacket(buf, 0, buf.length,

    InetAddress.getLocalHost(),6666);

    //发送数据

    socket.send(packet);

    //释放资源

    socket.close();

    System.out.println("UDP发送端关闭.....");

    }

    }

    接收端《

    publicclass ReceiveDemo {

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

    // udp接收端

    System.out.println("UDP接收端开启.....");

    //创建Socket对象

    DatagramSocket socket = newDatagramSocket(6666);

    //创建一个空的字节数组,是真正保存接收数据的容器

    byte[] buf = newbyte[65536];//1024*64=65536

    //创建一个空的数据报包,用于接收来自发送端的数据

    DatagramPacket packet = newDatagramPacket(buf, buf.length);

    //阻塞式方法,接收数据,将接收到的数据保存到指定的数据报包中

    socket.receive(packet);

    //从数据报包中获取数据

    String ip =packet.getAddress().getHostAddress();

    //               packet.getData()

    //接收数据

    String data = new String(buf,0, buf.length);

    System.out.println("接收到来自"+ip+"的数据"+data);

    System.out.println("UDP接收端关闭.....");

    //释放资源

    socket.close();

    }

    }

    1.3    简易聊天室

    练习:使用UDP协议实现一个DOS版的简易聊天室

    publicclass UdpExercise {

    public static void main(String[] args){

    // TODO Auto-generated methodstub

    //开启接收消息的线程

    new Thread(newReceiveMsg()).start();

    //开启一个发送消息的线程

    new Thread(newSendMsg()).start();

    }

    }

    //UDP接收器

    class ReceiveMsg implements Runnable{

    @Override

    public void run() {

    // TODOAuto-generated method stub

    DatagramSocketsocket = null;

    try {

    socket =new DatagramSocket(8888);

    for(;;){

    byte[]buf = new byte[1024];

    DatagramPacketpacket = new DatagramPacket(buf, buf.length);

    socket.receive(packet);

    Stringip = packet.getAddress().getHostAddress();

    Stringdata = new String(buf, 0, packet.getLength());

    System.out.println(ip+":"+data);

    }

    } catch(SocketException e) {

    // TODOAuto-generated catch block

    e.printStackTrace();

    } catch (IOExceptione) {

    // TODOAuto-generated catch block

    e.printStackTrace();

    }finally{

    if(socket!=null){

    socket.close();

    socket=null;

    }

    }

    }

    }

    //udp发送器

    class SendMsg implements Runnable {

    DatagramSocket socket = null;

    @Override

    public void run() {

    // TODOAuto-generated method stub

    try {

    socket =new DatagramSocket();

    BufferedReaderbr = new BufferedReader(new InputStreamReader(

    System.in));

    String line= null;

    while((line = br.readLine()) != null) {

    byte[]buf = line.getBytes();

    DatagramPacketpacket = new DatagramPacket(buf, 0,

    buf.length,InetAddress.getByName("192.168.95.255"),

    8888);

    socket.send(packet);

    }

    } catch (Exceptione) {

    // TODOAuto-generated catch block

    e.printStackTrace();

    }finally{

    if(socket!= null){

    socket.close();

    socket= null;

    }

    }

    }

    }

    相关文章

      网友评论

          本文标题: Java网络编程之UDP网络通信

          本文链接:https://www.haomeiwen.com/subject/erbmxxtx.html