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

文章目录

  • 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默认是无法启动多个客户端的,因此手动设置

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

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

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

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

相关文章

《HeadFirst设计模式(第二版)》第七章代码——适配器模式

代码文件目录: Example1: Duck package Chapter7_AdapterAndFacadePattern.Adapter.Example1;/*** Author 竹心* Date 2023/8/7**/public interface Duck {public void quack();public void fly(); }DuckTestDrive package Chapter7_AdapterAndFacadePattern.Ada…

IO学习-有名管道

1,要求实现AB进程对话 A进程先发送一句话给B进程,B进程接收后打印 B进程再回复一句话给A进程,A进程接收后打印 重复1.2步骤,当收到quit后,要结束AB进程 运行结果:

TS协议之PES(ES数据包)

TS协议之PAT(节目关联表)TS协议之PMT(节目映射表)TS协议之PES(ES数据包) 1. 概要 1.1 TS数据包(PES)协议数据组成 TSTS头PES头ES。TS,PES头是在音视频流传输过程中需要…

彩虹云商城搭建完整教程 完整的学习资料

彩虹云商城搭建完整教程 完整的学习资料提供给大家学习 随着电子商务的快速发展,越来越多的企业开始意识到开设一个自己的电子商城对于销售和品牌推广的重要性。然而,选择一家合适的网站搭建平台和正确地构建一个商城网站并不是一件容易的事情。本文将为…

Docker安装Mysql、Redis、nginx、nacos等环境

相关系列文章: 1、DockerHarbor私有仓库快速搭建 2、DockerJenkinsHarbor 1、服务器 Ip部署内容说明192.168.88.7Docker、Mysql、redis、nacosnode1192.168.88.8Docker、Mysql、redis、nacosnode2192.168.88.9Docker、redis、nacos、nginxnode3 2、安装PXC8.0 Mys…

路由的hash和history模式的区别

目录 ✅ 路由模式概述 一. 路由的hash和history模式的区别 1. hash模式 2. history模式 3. 两种模式对比 二. 如何获取页面的hash变化 ✅ 路由模式概述 单页应用是在移动互联时代诞生的,它的目标是不刷新整体页面,通过地址栏中的变化来决定内容区…

WSL 2 installation is incomplete的解决方案

问题描述 解决方案 在Windows功能中开启Hyper-v 如果没有Hyper-v选项,新建文本粘贴以下内容后以.cmd为后缀保存后执行即可 pushd "%~dp0" dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hyper-v.txt for /f %%i in (findstr /i . hyper-v.t…

matlab智能算法程序包89套最新高清录制!matlab专题系列!

关于我为什么要做代码分享这件事? 助力科研旅程! 面对茫茫多的文献,想复现却不知从何做起,我们通过打包成品代码,将过程完善,让您可以拿到一手的复现过程以及资料,从而在此基础上,照…

运动耳机哪个最好、顶级运动耳机推荐

拥有一款出色的运动耳机,是每个运动爱好者追求完美体验的必备选择。今天,我为大家推荐五款顶级运动耳机,它们不仅将音乐和运动完美结合,还具备出色的防水性能、舒适的佩戴感和激动人心的音质表现,让你在运动中尽情释放…

【2.2】Java微服务:nacos的使用

✅作者简介:大家好,我是 Meteors., 向往着更加简洁高效的代码写法与编程方式,持续分享Java技术内容。 🍎个人主页:Meteors.的博客 💞当前专栏: 深度学习 ✨特色专栏: 知识分享 &…

企业工程项目管理系统源码(三控:进度组织、质量安全、预算资金成本、二平台:招采、设计管理)em

​ 工程项目管理软件(工程项目管理系统)对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营,全过程、全方位的对项目进行综合管理 工程项目各模块及其功能点清单 一、系统管理 1、数据字典&#…

el-table合并单元格

el-tabel数据结构 此处为this.rolePermitItemList 合并后的样式&#xff1a; el-table-column 需要添加property字段&#xff0c;属性值同props&#xff0c;用来判断需要合并的字段 <el-table :data"rolePermitItemList" style"width: calc(100% );margi…

import有什么用,python中怎么使用import

目录 引言 import的概念 import的作用 import的应用 Python中如何使用import import报错处理 代码示例 注意事项 总结 引言 在Python编程语言中&#xff0c;import是一个关键字&#xff0c;用于将其他模块或库的功能引入当前代码中。import的概念和功能使得Python成为…

Unity制作护盾——1、闪电护盾

Unity引擎制作闪电护盾效果 大家好&#xff0c;我是阿赵。   这期做一个闪电护盾的效果。 一、效果说明 可以改变闪电的颜色 可以改变范围 改变贴图的平铺次数&#xff0c;也可以做出各种不同感觉的护盾。 二、原理 这个效果看着很复杂&#xff0c;其实只是用了一张N…

用 docker 创建 jmeter 容器,能做性能测试?

我们都知道&#xff0c;jmeter 可以做接口测试&#xff0c;也可以用于性能测试&#xff0c;现在企业中性能测试也大多使用 jmeter。docker 是最近这些年流行起来的容器部署工具&#xff0c;可以创建一个容器&#xff0c;然后把项目放到容器中&#xff0c;就可以构建出一个独立的…

杂记 | 记录一次使用Docker安装gitlab-ce的过程(含配置交换内存)

文章目录 01 准备工作02 &#xff08;可选&#xff09;配置交换内存03 编辑docker-compose.yml04 启动并修改配置05 nginx反向代理06 &#xff08;可选&#xff09;修改配置文件07 访问并登录 01 准备工作 最近想自建一个gitlab服务来保存自己的项目&#xff0c;于是找到gitla…

RabbitMQ的安装

RabbitMQ的安装 1、Windows环境下的RabbitMQ安装步骤 使用的版本&#xff1a;otp_win64_23.2 rabbitmq-server-3.8.16 版本说明&#xff1a;https://www.rabbitmq.com/which-erlang.html#compatibility-matrix 1.1 下载并安装erlang RabbitMQ 服务端代码是使用并发式语言…

mybatis-plus 用法

目录 1 快速开始 1.1 依赖准备 1.2 配置准备 1.3 启动服务 2 使用 2.1 实体类注解 2.2 CRUD 2.3 分页 2.4 逻辑删除配置 2.5 通用枚举配置 2.6 自动填充 2.7 多数据源 3 测试 本文主要介绍 mybatis-plus 这款插件&#xff0c;针对 springboot 用户。包括引入&…

【测试】软件测试工具JMeter简单用法

简明扼要&#xff0c;点到为止。 1. JMeter介绍 JMeter的全称是Apache JMeter&#xff0c;是一款用于软件测试的工具软件&#xff0c;其是开源免费的&#xff0c;由Apache基金会运营。 官网&#xff1a;Apache JMeter - Apache JMeter™ 2. 下载安装及运行 2.1 安装 Java8…

喀麦隆ECTN(BESC)申请流程

据CAMEROON喀麦隆法令&#xff0c;所有发货至喀麦隆的货物都必须申请ECTN(BESC)电子货物跟踪单。如果没有申请&#xff0c;将被视为触犯喀麦隆的条例&#xff0c;并在目的港受到严厉惩罚。ECTN是英语ELECTRONIC CARGO TRACKING NOTE的简称&#xff1b;BESC是法语BORDEREAU ELEC…