[网络编程]UDP协议,基于UDP协议的回显服务器

目录

1.UDP协议介绍

2.UDP协议在Java中的类

2.1DatagramSocket类

2.2DatagramPacket

3.回显服务器

3.1Sever端 

3.2Client端

1.UDP协议介绍

  UDP协议是一种网络协议,它是无连接的,全双工,并且是面向数据报,不可靠的一种协议。常用于在线视频播放,游戏这种实时性要求比较高的应用。或者无需可靠传输的应用,如DNS查询 SNMP等。一次UDP数据报报文传输的数据最大为64kb,实际上,UDP因为头部占用八个字节。所以可传输的精准大小为64kb-8b = 65507字节。

2.UDP协议在Java中的类

 UDP协议作为传输层协议,在Java中我们无需面对原生UDP协议,我们只需要调用Java封装好的类来使用UDP协议来传输和接受数据即可。在Java中有两个类,分别是DatagramSocket类和DatagramPacket类。

2.1DatagramSocket类

DatagramSocket用于创建Socket,绑定到端口号。它将网卡抽象成文件来方便程序猿来来操作。

DatagramSocket类的构造方法:
DatagramSocket类里的方法:

方法签名方法说明
void
receive(DatagramPacket p)
从此套接字接收数据报(如果没有接收到数据报,该方法会阻
塞等待)
void send(DatagramPacket
p)
从此套接字发送数据报包(不会阻塞等待,直接发送)
void close()关闭此数据报套接字

2.2DatagramPacket

DatagramPacket是UDP Socket发送和接收的数据报

DatagramPacket的构造方法:

方法签名方法说明
DatagramPacket(byte[]
buf, int length)
构造一个DatagramPacket以用来接收数据报,接收的数据保存在
字节数组(第一个参数buf)中,接收指定长度(第二个参数
length)
DatagramPacket(byte[]
buf, int offset, int length,
SocketAddress address)
构造一个DatagramPacket以用来发送数据报,发送的数据为字节
数组(第一个参数buf)中,从0到指定长度(第二个参数
length)。address指定目的主机的IP和端口号

DatagramPacket的方法:

方法签名方法说明
InetAddress
getAddress()
从接收的数据报中,获取发送端主机IP地址;或从发送的数据报中,获取
接收端主机IP地址
int getPort()从接收的数据报中,获取发送端主机的端口号;或从发送的数据报中,获
取接收端主机端口号
byte[] getData()获取数据报中的数据

3.回显服务器

为了方便大家理解和更好的使用UDP协议中的这两个类来实现网络编程,跨主机通信。

我们来写个简单的客户端-服务器程序-回显服务器,客户端将数据发送到服务器上,服务器在返回给客户端这个数据并且打印下来。主要目的是为了方便大家理解。

3.1Sever端 

在Sever端写之前,我们先讲明白几件事,首先就是我们的构造方法要不要指定端口号。答案是肯定的,因为这是服务器端,客户端想要访问它,肯定要有一个固定的地址,不然如何去访问,所以在构造方法中,我们直接从1024-65535这些端口号中选择一个给绑定上。

还有就是我们的主要逻辑过程:

1.接受数据并解析

2.将这个数据进行服务器的操作,即根据请求计算响应。

3.将响应返回给客户端。

明白了这些以后,我们开始编写代码

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import java.nio.charset.StandardCharsets;

public class UdpEchoSever {
    DatagramSocket socket = null;
    public UdpEchoSever (int sort) throws SocketException {
        socket = new DatagramSocket(sort);//因为是服务器程序,所以我们要指定端口号
    }
    public void start() throws IOException {
        while (true){ //这里的while(true)是因为会有很多客户端来访问这个服务器,所以我们的服务器是7*24小时运行的
            System.out.println("服务器启动");
            byte[] bytes = new byte[1024];
            DatagramPacket packet = new DatagramPacket(bytes,0,bytes.length); //创建一个数据报用来接收,这是一个输出型参数
            socket.receive(packet); //如果没有客户端进行访问,就会进行阻塞等待
            String request = new String(packet.getData(),0, packet.getLength()); //将这个数据报解析成字符串的形式
            String response = fun(request);
            DatagramPacket responsePacket = new DatagramPacket(response.getBytes(),response.getBytes().length,packet.getSocketAddress());
            //在构造的时候要将数据报转化为字符数组,并且指定IP地址和端口号发送,这里我们的IP地址和端口号,已经被存入到,packet.getSocketAddress()里面了
            System.out.printf("[%s :%d] req:%s,resp : %s\n",responsePacket.getAddress().toString(),responsePacket.getPort(),request,response);
            socket.send(responsePacket);
        }
    }

    private String fun(String request) {
        return request;
    }

    public static void main(String[] args) throws IOException {
        UdpEchoSever udpEchoSever = new UdpEchoSever(9090);
        udpEchoSever.start();
    }
}

3.2Client端

至于客户端,我们的逻辑就是,在构造方法里,要传入服务器的IP地址和端口号,以方便后续使用。

至于主方法,我们的大概思路分为以下几步
1.用户通过控制台输入,并且构造成DatagramPacket数据报,此时这个类里面应该有我们的数据和IP地址以及端口号

2.将这个数据报发送给服务器

3.从服务器拿到响应并且解析

4.将解析的响应打印出来

现在我们开始编程:

import javax.xml.ws.soap.Addressing;
import java.io.IOException;
import java.net.*;
import java.util.Scanner;

public class UdpEchoClient {
    DatagramSocket socket = null;
    int severport;
    String severIp;
    public UdpEchoClient(String severIp,int severport) throws SocketException { //在构造方法中传入服务器的IP地址和端口号
        socket = new DatagramSocket();
        this.severIp = severIp;
        this.severport = severport;
    }
    public void start() throws IOException {
        Scanner scanner = new Scanner(System.in);
        System.out.println("客户端启动");
        while (true){
            System.out.print("->");
            if(!scanner.hasNext()){ //用户输入到回车等这些空字符以后就结束
                break;
            }
            String request = scanner.next();
            DatagramPacket requestPacket = new DatagramPacket(request.getBytes(),request.getBytes().length,
                    InetAddress.getByName(severIp),severport); //将数据以及IP地址(这里的IP地址是字符串,
            // 所以我们需要调用InetAddress.getByName())以及端口号也写进去
            socket.send(requestPacket);//发送到服务器
            byte[] bytes = new byte[1024];
            DatagramPacket responsPacket = new DatagramPacket(bytes,bytes.length);//同样是输出型参数,所以要先有一个空的字符数组
            socket.receive(responsPacket);//接收服务器传来的响应
            String respons = new String(responsPacket.getData(),0,responsPacket.getLength());//将响应转化为字符串
            System.out.println(respons);//打印下来
        }
    }

    public static void main(String[] args) throws IOException {
        UdpEchoClient udpEchoClient = new UdpEchoClient("127.0.0.1",9090);
        udpEchoClient.start();
    }
}

我们来看看运行结果

 可以看到客户端没有问题。我们再来看看服务器端的控制台:

也和我们预期的结果一样

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/338897.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

交友盲盒小程序版本 全开源版本-YISHEN源码网

这个小程序是云开发的不需要服务器域名 支持流量主wx支付。超级能吸引年轻人的一款小程序 版本新增: 1.Ui美化 2.星座匹配(通过星座进行盲盒) 3.后台管理(可以实时看到用户数量) 4.支付S I P 9功能(后…

vue3-模版引用ref

1. 介绍 概念&#xff1a;通过 ref标识 获取真实的 dom对象或者组件实例对象 2. 基本使用 实现步骤&#xff1a; 调用ref函数生成一个ref对象 通过ref标识绑定ref对象到标签 代码如下&#xff1a; 父组件&#xff1a; <script setup> import { onMounted, ref } …

React、vue、h5端项目避免缓存

前言&#xff1a; h5项目和pc端项目上线时&#xff0c;有时只有细微的改变&#xff0c;但是部署完后&#xff0c;再次访问却是没变化。必须清除缓存才行。 pc端项目手动清除一下还行&#xff0c;但是h5项目却不行。尤其 嵌套在app里&#xff0c;只能 清除 app的缓存&#xff0…

数据库(表的基本操作)

目录 1.1 表的基本操作 1.1.1 创建表 1.1.2 表物理存储结构 1.1.3 数据类型 文本类型&#xff1a; 数字类型&#xff1a; 时间/日期类型&#xff1a; 常用的数据类型&#xff1a; 1.1.4 查看表 SHOW 命令 查看表结构&#xff1a; 1.1.5 删除表 查看表结构&#xf…

TCP服务器的演变过程:C++使用libevent库开发服务器程序

C使用libevent库开发服务器程序 一、引言二、libevent简介三、Libevent库的封装层级3.1、reactor对象封装struct event_base3.2、事件对象struct event3.3、struct bufferevent对象3.4、evconnlistener对象3.5、事件循环3.6、事件处理 四、完整示例代码小结 一、引言 手把手教…

论文精读--ResNet

ResNet论文 撑起计算机视觉半边天的ResNet【论文精读】_哔哩哔哩_bilibili Abstract Deeper neural networks are more difficult to train. We present a residual learning framework to ease the training of networks that are substantially deeper than those used pre…

E/E架构升级是汽车智能化发展关键

E/E架构升级是汽车智能化发展的关键。传统汽车采用的分布式E/E架构因计算能力不足、通讯带宽不足、不便于软件升级等瓶颈&#xff0c;无法满足现阶段汽车发展的需求&#xff0c;E/E架构升级将助力智能汽车实现跨越式革新。汽车E/E架构升级主要体现在硬件架构升级、软件架构升级…

docker:Web迁移

系列文章目录 docker&#xff1a;环境安装 docker:Web迁移 文章目录 系列文章目录前言一、Mariadb1.拉取镜像2.创建容器3.数据同步4.数据分离 二、PHP项目1.拉取镜像2.创建容器3.容器互通 三、Flask项目1.拉取镜像2.创建镜像3.自定义镜像1.安装apache2.安装python33.意外退出 …

【Qt Quick 项目(第一集Qt Quick UI 项目项目创建)】

# Qt Quick 项目 到底什么是Qt Qml、什么是Qt Quick、QtQuick应用程序与Qt Widget程序有何区别,为了让读者在学习QML之前有一个整体认识,这里先介绍几个Quick项目。 01 Qt Quick UI 项目

SCTP, TCP, UDP, IP, ICMP都在哪一层?(TCP/IP网络通信协议学习)

TCP/IP网络通信协议最早是由罗伯特卡恩&#xff08;Robert E. Kahn&#xff09;和文顿瑟夫&#xff08;Vinton G. Cerf&#xff09;于1972年提出的&#xff0c;它是一个实际的协议栈。 OSI七层网络通信协议最早是由国际标准化组织&#xff08;ISO&#xff09;于1977年提出的&am…

在CentOS 7 中配置NFS服务器

目录 1、克隆两个虚拟机 2、安装 NFS 服务 3、NFS 服务使用 1、克隆两个虚拟机 nfs-servernfs-client&#xff08;修改ip地址&#xff09;[rootxnode1 ~]# cd /etc/sysconfig/network-scripts/[rootxnode1 network-scripts]# vi ifcfg-eno16777736 #修改内容如下 BOOTPROT…

2024腾讯云服务器租用价格多少钱一年?1个月和1小时收费明细表

腾讯云服务器租用优惠价格表&#xff1a;轻量应用服务器2核2G3M价格62元一年、2核2G4M价格118元一年&#xff0c;540元三年、2核4G5M带宽218元一年&#xff0c;2核4G5M带宽756元三年、轻量4核8G12M服务器646元15个月&#xff0c;云服务器CVM S5实例2核2G配置280.8元一年、GPU服…

第三篇【传奇开心果系列】Vant开发移动应用:财务管理应用

传奇开心果博文系列 系列博文目录Vant开发移动应用系列博文 博文目录一、项目目标二、编程思路三、初步实现示例代码四、扩展思路五、使用Firebase等后端服务来实现用户认证和数据存储示例代码六、用Vant组件库实现收入和支出分类管理的示例代码七、用Vant组件库实现收入和支出…

【Bugku-web】计算器

1.打开训练场景 2.按"F12"查看页面源代码&#xff0c;根据箭头指向可以看到这个空白框内的长度为1&#xff0c;也就是输完一个字就不能往后输了&#xff0c;根据这样就直接更改数据1改3&#xff0c; 3.改后&#xff1a;多写几个字不碍事&#xff0c;然后计算正确值是…

第04章_IDEA的安装与使用(下)(IDEA断点调试,IDEA常用插件)

文章目录 第04章_IDEA的安装与使用&#xff08;下&#xff09;8. 快捷键的使用8.1 常用快捷键8.2 查看快捷键1、已知快捷键操作名&#xff0c;未知快捷键2、已知快捷键&#xff0c;不知道对应的操作名 8.3 自定义快捷键8.4 使用其它平台快捷键 9. IDEA断点调试(Debug)9.1 为什么…

响应式Web开发项目教程(HTML5+CSS3+Bootstrap)第2版 例4-7 datalist

代码 <!doctype html> <html> <head> <meta charset"utf-8"> <title>datalist</title> </head><body> <input id"address" list"addressList"> <datalist id"addressList"…

Typora + PicGo + GitHub搭建图床

Typora PicGo GitHub搭建图床 1. Typora下载破解 这一步自行百度 2. PicGo下载 PicGo is Here | PicGo 自行下载安即可 3. GitHub仓库设置 gitHub注册略过&#xff0c;如果不能访问请科学上网 创建仓库 生成访问token 点击右上角头像 -> setting -> 点击左边最…

C语言从入门到入坟

前言 1.初识程序 有穷性 在有限的操作步骤内完成。有穷性是算法的重要特性&#xff0c;任何一个问题的解决不论其采取什么样的算法&#xff0c;其终归是要把问题解决好。如果一种算法的执行时间是无限的&#xff0c;或在期望的时间内没有完成&#xff0c;那么这种算法就是无用…

万界星空科技MES系统的生产管理流程

对于生产型工厂来说&#xff0c;车间生产流程无疑是最重要的管理环节&#xff0c;繁琐的生产细节让企业很难找到合理的生产管理方法&#xff0c;导致人工效率低、错误多、成本高。如果想要解决这些问题&#xff0c;工厂就必须要有一套自己的生产管理系统&#xff0c;这样才能提…

为什么单片机不能直接驱动继电器和电磁阀?

为什么单片机不能直接驱动继电器和电磁阀&#xff1f; 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「单片机的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&…