• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Day25_8 JavaUDP通信程序

武飞扬头像
浮生 丶如梦
帮助1

目录

一、UDP通信的概述

1.两个类的构造方法如下:

2.DatagramSocket类的主要常用方法如下:

二、UDP通信的实现客服服务程序演示

1.客户端发送方类:

2.客服服务端接收方类:

3.运行结果:


一、UDP通信的概述

解析:

2.UDP是一个面向无连接,不可靠的传输层协议,它在java中的实现主要依靠两个类:DatagramSocket,DatagramPacket

DatagramSocket类的作用:发送和接收数据包的套接字,不维护连接状态,不产生输入输出流

DatagramPacket类的作用:数据包,封装了数据,数据长度

1.两个类的构造方法如下:

DatagramPacket构造方法:

构造方法 说明
DatagramPacket(byte [] buf,int length,InetAddress address,int port) Buf是数据的字节数组,length是字节数组的长度,address是目标主机的IP地址,port是目标主机的端口 该构造用来构造对象,将长度为length的包发送到指定主机上的指定端口号

DatagramSocket的构造方法:

构造方法 说明
DatagramSocket() 创建DatagramSocket对象,并将其与本地主机上任何可用的端口绑定
DatagramSocket(int port) 创建一个DatagramSocket对象,并将其与本地主机上的指定端口绑定

特别注意:1.在UDP通信中,通信的双方中,至少有一方需要指定端口号,2.在发送数据时数据包类对象创建时,一定要写入目标ip与端口号,而在接收数据时可以免除不写。3.若要通信双方都要相互通信时,则务必将双方的端口号都明确。 

2.DatagramSocket类的主要常用方法如下:

常用方法 说明
void send(DatagramPacket p) 发送指定的数据报
void receive(DatagramPacket p) 接收数据报.收到数据以后,存放在指定的DatagramPacket对象中
void close() 关闭当前的DatagramSocket对象

特别注意:1.发送和接收行为方法都是由上述类对象执行的,与数据包类对象无关,2.UDP通信中并不需要明确的服务器概念,双方几乎是一样的操作, 通俗的说就是两个边即是服务端又是客户端。 

二、UDP通信的实现客服服务程序演示

1.客户端发送方类:

  1.  
    package com.feisi.work27;
  2.  
     
  3.  
    import java.io.IOException;
  4.  
    import java.net.*;
  5.  
    import java.util.Scanner;
  6.  
     
  7.  
    /**
  8.  
    * @author 14491
  9.  
    * @version 1.0.0
  10.  
    * @description 3、 使用基于UDP的Java Socket编程,完成在线咨询功能
  11.  
    * 1)客户向咨询人员咨询。
  12.  
    * 2)咨询人员给出回答。
  13.  
    * 3)客户和咨询人员可以一直沟通,直到客户发送bye给咨询人员
  14.  
    * @date 2022/8/25 18:58
  15.  
    */
  16.  
    public class Client1 {
  17.  
    public static void main(String[] args) throws IOException {
  18.  
    // 这里是客户发送端
  19.  
    // 创建控住台输入对象
  20.  
    Scanner scanner = new Scanner(System.in);
  21.  
    // 创建发送对象 写上自己的端口号
  22.  
    DatagramSocket socket = new DatagramSocket(6565);
  23.  
     
  24.  
    // 循环为了一直能够对话
  25.  
    while (true){
  26.  
    System.out.println("请输入咨询问题!");
  27.  
    String mas = scanner.next();
  28.  
     
  29.  
    // 创建数据包对象 为了打包数据 发送数据时必须带上目的ip地址与端口号
  30.  
    DatagramPacket packet = new DatagramPacket(mas.getBytes(),mas.getBytes().length,
  31.  
    InetAddress.getByName("localhost"),8080);
  32.  
    // 发送数据
  33.  
    socket.send(packet);
  34.  
     
  35.  
     
  36.  
    // 接收数据时无需指定ip地址与端口号
  37.  
    byte b[] = new byte[1024];
  38.  
    int len = b.length;
  39.  
    DatagramPacket packet1 = new DatagramPacket(b,len);
  40.  
    socket.receive(packet1);
  41.  
    System.out.println(new String(b,0,packet1.getLength()));
  42.  
     
  43.  
    // 若输入为bye则结束
  44.  
    if (mas.equals("bye")){
  45.  
    // 结束整个循环 结束咨询
  46.  
    break;
  47.  
    }
  48.  
     
  49.  
    }
  50.  
     
  51.  
    }
  52.  
    }
学新通

2.客服服务端接收方类:

  1.  
    package com.feisi.work27;
  2.  
     
  3.  
    import java.io.IOException;
  4.  
    import java.net.DatagramPacket;
  5.  
    import java.net.DatagramSocket;
  6.  
    import java.net.InetAddress;
  7.  
    import java.util.Scanner;
  8.  
     
  9.  
    /**
  10.  
    * @author 14491
  11.  
    * @version 1.0.0
  12.  
    * @description TODO
  13.  
    * @date 2022/8/25 18:58
  14.  
    */
  15.  
    public class Client2 {
  16.  
    public static void main(String[] args) throws IOException {
  17.  
    // 服务接收端
  18.  
     
  19.  
    // 创建控制台输入对象
  20.  
    Scanner scanner = new Scanner(System.in);
  21.  
    // 创建解析对象
  22.  
    DatagramSocket socket = new DatagramSocket(8080);
  23.  
     
  24.  
    while (true){
  25.  
    // 创建数据包对象
  26.  
    byte b[] = new byte[1024];
  27.  
    int len = b.length;
  28.  
    DatagramPacket packet = new DatagramPacket(b,len);
  29.  
    // 接收数据包
  30.  
    socket.receive(packet);
  31.  
    // 输出数据
  32.  
    String mag = new String(b,0,packet.getLength());
  33.  
    System.out.println(mag);
  34.  
     
  35.  
     
  36.  
    // 发送数据 记得带ip地址 与端口号
  37.  
    System.out.println("请输入您的反馈!");
  38.  
    String mas = scanner.next();
  39.  
    DatagramPacket packet1 = new DatagramPacket(mas.getBytes(),mas.getBytes().length,
  40.  
    InetAddress.getByName("localhost"),6565);
  41.  
    socket.send(packet1);
  42.  
     
  43.  
    // 若接收的数据消息为bye
  44.  
    if (mag.equals("bye")){
  45.  
    // 结束循环
  46.  
    break;
  47.  
    }
  48.  
     
  49.  
    }
  50.  
     
  51.  
    }
  52.  
    }
学新通

3.运行结果:

客户端运行结果:

学新通

客服端运行结果:

 学新通

特别注意:在UDP通信程序中切记先开启接收方,接收方:也就是该类从上之下执行时,先执行的是接收数据而不是发送数据,以免造成数据的丢失。

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgbfeef
系列文章
更多 icon
同类精品
更多 icon
继续加载