使用socket实现UDP版的回显服务器

news2024/11/17 7:29:44

文章目录

  • 1. Socket简介
  • 2. DatagramSocket
  • 3. DatagramPacket
  • 4. InetSocketAddress
  • 5. 实现UDP版的回显服务器

在这里插入图片描述

1. Socket简介

Socket(Java套接字)是Java编程语言提供的一组类和接口,用于实现网络通信。它基于Socket编程接口,提供了一种简单而强大的方式来实现网络应用程序。

socket类库提供了丰富的方法和功能,用于处理网络通信的各个方面。它支持TCP和UDP协议,可以实现可靠的、面向连接的通信(TCP)或不可靠的、无连接的通信(UDP)。Java Socket还提供了一些高级功能,如多线程处理、异步通信、加密通信等,以满足不同网络应用的需求。

本文主要使用Socket实现UDP版的客户端和服务器

  • DatagramSocket 是UDP Socket,用于发送和接收UDP数据报。

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

2. DatagramSocket

DatagramSocket是Java网络编程中用于实现UDP协议的类。它是基于Socket类的子类,用于发送和接收UDP数据报。

DatagramSocket 的构造方法:

方法说明
DatagramSocket()创建一个UDP数据报套接字的socket,绑定本机任意一个随机端口(一般用户客户端)
DatagramSocket(int port)创建一个UDP数据套接字的socket,绑定指定的port端口(一般用于服务端)

DatagramSocket的常用方法如下:

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

3. DatagramPacket

DatagramPacket是Java网络编程中用于封装和解析UDP数据报(Datagram)的类。它用于在DatagramSocket中发送和接收UDP数据报

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()获取数据报中的数据

4. InetSocketAddress

InetSocketAddress是Java网络编程中用于表示IP地址和端口号的类。它是SocketAddress类的子类,用于在网络通信中指定主机的地址和端口。

简单介绍一下InetSocketAddress的构造方法:

InetSocketAddress(InetAddress addr,int port)创建一个Socket地址,包含IP地址和端口号

5. 实现UDP版的回显服务器

回显服务器(Echo Server)是一种简单的网络服务器应用,它接收客户端发送的数据,并将接收到的数据原样返回给客户端。

客户端代码:

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.util.Scanner;

public class UdpEchoClient {
    private DatagramSocket socket = null;
    private String serverIp;
    private int serverPort;

    public UdpEchoClient(String serverIp, int serverPort) throws SocketException {
        socket = new DatagramSocket(serverPort);
        this.serverIp = serverIp;
        this.serverPort = serverPort;
    }

    public void start() throws IOException {
        System.out.println("客户端上线!");
        Scanner scanner = new Scanner(System.in);

        while (true) {
            // 读取用户输入的内容
            System.out.println("-> ");
            String request = scanner.next();
            // 构造 UDP请求,并发送给服务器
            DatagramPacket reqPacket = new DatagramPacket(request.getBytes(), request.getBytes().length,
                    InetAddress.getByName(this.serverIp), this.serverPort);
            socket.send(reqPacket);

            // 从服务器读取响应
            DatagramPacket respPacket = new DatagramPacket(new byte[4096], 4096);
            socket.receive(respPacket);
            String resp = new String(respPacket.getData(), 0, respPacket.getLength());
        }
    }

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

服务器代码:

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class UdpEchoServer {
    private DatagramSocket socket = null;

    // port 为服务器要绑定的端口
    public UdpEchoServer(int port) throws SocketException {
        socket = new DatagramSocket(port);
    }

    /**
     * 服务器启动方法
     */
    public void start() throws IOException {
        System.out.println("服务器启动!");
        while (true) {
            // 读取请求并解析
            DatagramPacket reqPacket = new DatagramPacket(new byte[4096], 4096);
            socket.receive(reqPacket);
            // 解析请求
            String req = new String(reqPacket.getData(), 0, reqPacket.getLength());
            // 计算响应
            String resp = process(req);
            // 将响应返回给客户端
            DatagramPacket respPacket = new DatagramPacket(resp.getBytes(), resp.getBytes().length,
                    reqPacket.getSocketAddress());
            socket.send(respPacket);
            // 打印日志
            System.out.printf("[%s:%d] req: %s;resp: %s\n", reqPacket.getSocketAddress().toString(),
                    reqPacket.getPort(), req, resp);
        }
    }

    /**
     * 根据请求计算响应
     * 因为是 回显服务器,直接返回即可
     *
     * @param req
     */
    private String process(String req) {
        return req;
    }

    public static void main(String[] args) throws IOException {
        UdpEchoServer echoServer = new UdpEchoServer(6666);
        echoServer.start();
    }
}

运行流程:
在这里插入图片描述

运行结果:

在这里插入图片描述

在这里插入图片描述

另外服务器是给多个客户端提供服务器的,IDEA默认是无法启动多个客户端的,因此手动设置

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【测试学习五】测试类型的划分(重点:白盒与黑盒测试)

目录 一、测试类型的分类 1、按测试对象划分 2、是否查看代码划分(重点) 🌷(1)黑盒测试 🌷(2)白盒测试 🌷(3)灰盒测试 3、按照开发阶段划…

JVM分析工具JProfiler介绍及安装

目录 一、什么是JProfiler? 二、JProfiler 功能结构 1、分析代理 2、记录数据 3、快照 三、安装 一、什么是JProfiler? JProfiler是一个专业的工具,用于分析运行中的JVM内部发生的事情。当您的生产系统出现问题时,您可以…

FileZilla Server同时共享多个目录(手把手教你使用FileZilla Server同时设置多个目录)

网上的基本全是一句话带过怎么共享多个目录,没图很烦,所以我自己就写一个过程 目录 1、创建ftp用户并设置密码 1.1、进入用户管理 1.2、新建用户 1.3、设置密码 2、添加共享的目录 2.1、选择用户添加目录 2.2、给予用户访问权限 2.2.1、客户端访…

小程序服务器配置多大够用?

​  了解小程序服务器的大小和要求对于确保小程序的高效运行非常重要。下面将介绍小程序服务器的大小和要求,帮助您选择合适的服务器。 服务器费用 服务器费用因服务器类型、配置和带宽等因素而异。一般而言,小型小程序服务器的年费用在500元至2000元之…

SpringCloud之微服务API网关Gateway介绍

文章目录 1 微服务API网关Gateway1.1 网关简介1.2 Spring Cloud Gateway介绍1.3 Gateway特性1.4 Gateway核心概念1.4.1 路由1.4.1.1 定义1.4.1.2 动态路由 1.4.2 断言1.4.2.1 默认断言1.4.2.2 自定义Predicate 1.4.3 过滤器1.4.3.1 默认过滤器1.4.3.2 自定义Filter(…

2023年第三届工业自动化、机器人与控制工程国际会议 | IET独立出版 | EI检索

会议简介 Brief Introduction 2023年第三届工业自动化、机器人与控制工程国际会议(IARCE 2023) 会议时间:2023年10月27 -30日 召开地点:中国成都 大会官网:www.iarce.org 2023年第三届工业自动化、机器人与控制工程国际…

【DMA】认识 DMA 及其工作流程

DMA(Direct Memory Access),字面意思“直接访问内存”,无需 CPU 干预直接读写内存。传统CPU读写数据时,需要先将要使用的数据保存到 RAM,等要用时再从RAM 加载。 目录 一、传统CPU存取数据 二、认识DMA …

安防视频监控汇聚平台EasyCVR接入Ehome告警,公网快照不显示是什么原因?

智能视频监控汇聚平台TSINGSEE青犀视频EasyCVR可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等,视频监控管理平台…

openCV图像读取和显示

文章目录 一、imread二、namedWindow三、imshow #include <opencv2/opencv.hpp> #include <iostream>using namespace std; using namespace cv;int main(int argc,char** argv) {cv::Mat img imread("./sun.png"); //3通道 24位if (img.empty()) {std:…

App自动化测试|dom结构和元素定位方式

先来看几个名词和解释&#xff1a; dom: Document Object Model 文档对象模型 dom应用: 最早应用于html和js的交互。界面的结构化描述&#xff0c; 常见的格式为html、xml。核心元素为节点和属性 xpath: xml路径语言&#xff0c;用于xml 中的节点定位&#xff0c;XPath 可在 x…

ABAP 自定义搜索功能 demo1

ABAP 自定义搜索功能 demo1 效果&#xff1a; 双击选中行则为选中对应发票 实现 1定义 定义屏幕筛选参数 SELECTION-SCREEN BEGIN OF SCREEN 9020. SELECT-OPTIONS:s1_belnr FOR rbkp-belnr, s1_gjahr FOR rbkp-gjahr, s1_lifnr FOR rbkp-lifnr, s1_erfna FOR rbkp-erfnam, …

Go学习第四天

Interface空接口万能类型与类型断言机制 package mainimport "fmt"// interface{}是万能数据类型 func myFunc(arg interface{}) {fmt.Println("myFunc is celled....")fmt.Println(arg)// interface{} 该如何区分 此时引用的底层数据类型到底是什么&…

14-5_Qt 5.9 C++开发指南_基于HTTP 协议的网络应用程序

文章目录 1. 实现高层网络操作的类2. 基于HTTP协议的网络文件下载3.源码3.1 可是化UI设计3.2 mainwindow.h3.3 mainwindow.cpp 1. 实现高层网络操作的类 Qt 网络模块提供一些类实现 OSI 7 层网络模型中高层的网络协议&#xff0c;如 HTTP、FTP、SNMP等&#xff0c;这些类主要是…

linux Ubuntu 更新镜像源、安装sudo、nvtop

1.更换镜像源 vi ~/.pip/pip.conf在打开的文件中输入: pip.conf [global] index-url https://pypi.tuna.tsinghua.edu.cn/simple按下:wq保存并退出。 2.安装nvtop 如果输入指令apt install nvtop报错&#xff1a; E: Unable to locate package nvtop 需要更新一下apt&a…

MacBook Pro 16 M1 Max 升级 macOS Ventura 13.5 兼容测评

今天给大家带来了 MacBook Pro 16 M1 Max 升级 macOS Ventura 13.5 兼容 100 挑战赛 的视频&#xff0c;现在充电头再以文章的形式呈现给大家&#xff0c;让大家更清楚、直白的了解这款笔记本在升级系统后的兼容性如何。 MacBook Pro 16 M1 Max 配置了 140W 的 MagSafe 充电口&…

设备管理系统与物联网的融合:实现智能化设备监控和维护

在数字化时代&#xff0c;设备管理系统和物联网技术的融合为工业企业带来了巨大的变革和创新。本文将探讨设备管理系统与物联网的融合&#xff0c;重点介绍设备健康管理平台在实现智能化设备监控和维护方面的关键作用和优势。 一、设备管理系统与物联网的融合 随着物联网技术的…

37.利用linprog解 有约束条件多元变量函数最小值(matlab程序)

1.简述 linprog函数主要用来求线型规划中的最小值问题&#xff08;最大值的镜像问题&#xff0c;求最大值只需要加个“-”&#xff09; 2. 算法结构及使用方法 针对约束条件为Axb或Ax≤b的问题 2.1 linprog函数 xlinprog(f,A,b) xlinprog(f,A,b,Aeq,beq) xlinprog(f,A,b,Aeq,…

PROFINET转ETHERCAT协议网关三菱plc支持ethercat吗

捷米特JM–ECAT-PN是自主研发的一款 PROFINET 从站功能的通讯网关。该产品主要功能是将 PROFINET 网络和 ETHERCAT 网络连接起来。 捷米特JM-ECAT-PN连接到 PROFINET 总线中做为从站使用&#xff0c;连接到 ETHERCAT 总线中做为从站使用。 3.技术参数 PROFINET 技术参数 网关…

软件测试界扎心的谣言:为什么说功能测试是巨坑?

​ 前言 一般而言&#xff0c;想要持续在行业内发展&#xff0c;会选择继续提升自己的测试技能&#xff0c;而目前自动化测试作为业内最主流的技术&#xff0c;往后发展可以进阶到测试开发&#xff0c;但前提条件还是要掌握到足够好的自动化测试技术才行。包括说编程语言的学习…

918. 环形子数组的最大和;2531. 使字符串总不同字符的数目相等;1238. 循环码排列

918. 环形子数组的最大和 核心思想&#xff1a;其实这题不加环形很好做&#xff0c;就是一个动态规划或者贪心就能够解决。加了环形我们应该怎么考虑呢&#xff0c;无非就是两种&#xff0c;第1种是子数组只包含首尾的一个&#xff0c;我们直接求子数组的最大连续和即可&#…