当前位置: 首页 > news >正文

【Java】网络编程-UDP回响服务器客户端简单代码编写

这一篇文章我们将讲述网络编程中UDP服务器客户端的编程代码

1、前置知识

UDP协议全称是用户数据报协议,在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议。

UDP的特点有:无连接、尽最大努力交付、面向报文、没有拥塞控制

本文讲的回响服务器是指客户端向服务器发送一个报文,从服务器那里得到一条一模一样的回响报文

该代码需要在同一个包下创建两个类,服务器UdpEchoServer类,客户端UdpEchoClient类

2、服务器端代码

(1)完整代码

先放上完整代码

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import java.nio.charset.StandardCharsets;public class UdpEchoServer {public static DatagramSocket socket = null;public UdpEchoServer(int port) throws SocketException {//手动指定服务器端口号socket = new DatagramSocket(port);}public static void start() throws IOException {while (true){System.out.println("服务器启动");DatagramPacket requestPacket = new DatagramPacket(new byte[1024],1024);socket.receive(requestPacket);String request = new String(requestPacket.getData(),0,requestPacket.getLength());String response = process(request);DatagramPacket responsePacket = new DatagramPacket(response.getBytes(),response.getBytes().length,requestPacket.getSocketAddress());socket.send(responsePacket);System.out.printf("[%s:%d] req:%s,resp:%s",requestPacket.getAddress(),requestPacket.getPort(),request,response);System.out.println();}}public static String process(String request){return request;}public static void main(String[] args) throws IOException {UdpServer server = new UdpServer(9090);server.start();}}

(2)代码讲解

构造方法中手动指定服务器端口号

public UdpEchoServer(int port) throws SocketException {//手动指定服务器端口号socket = new DatagramSocket(port);
}

start()方法中进行信息的接收、处理、发送 

public static void start() throws IOException {while (true){System.out.println("服务器启动");//创建接收报文,用socket进行接收请求报文DatagramPacket requestPacket = new DatagramPacket(new byte[1024],1024);socket.receive(requestPacket);//将请求报文转化为请求字符串,用process()方法进行处理,得到响应字符串String request = new String(requestPacket.getData(),0,requestPacket.getLength());String response = process(request);//将得到的响应字符串转化为响应报文,并用socket进行发送DatagramPacket responsePacket = new DatagramPacket(response.getBytes(),response.getBytes().length,requestPacket.getSocketAddress());socket.send(responsePacket);//打印客户端IP地址和端口号信息System.out.printf("[%s:%d] req:%s,resp:%s",requestPacket.getAddress(),requestPacket.getPort(),request,response);System.out.println();}
}

process()方法

直接返回接收到的字符串

public static String process(String request){return request;
}

3、 客户端代码

 (1)完整代码

import java.io.IOException;
import java.net.*;
import java.util.Scanner;public class UdpEchoClient {public static DatagramSocket socket = null;private static String ip = null;private static int port = 0;public UdpEchoClient(String ip,int port) throws SocketException {//系统自动为客户端分配端口socket = new DatagramSocket();this.ip = ip;this.port = port;}public static void start() throws IOException {System.out.println("客户端启动!");Scanner scanner = new Scanner(System.in);while (true){System.out.print("->");String request = scanner.next();DatagramPacket requestPacket = new DatagramPacket(request.getBytes(),request.getBytes().length, InetAddress.getByName(ip),port);socket.send(requestPacket);DatagramPacket responsePacket = new DatagramPacket(new byte[1024],1024);socket.receive(responsePacket);String response = new String(responsePacket.getData(),0,responsePacket.getLength());System.out.println(response);}}public static void main(String[] args) throws IOException {UdpEchoClient client = new UdpEchoClient("127.0.0.1",9090);client.start();}
}

(2)代码讲解

客户端由于可能有多个,所以需要系统自动为客户端分配端口

当初始化socket时,客户端还需要记下服务器端的ip和端口 

public static DatagramSocket socket = null;
private static String ip = null;
private static int port = 0;public UdpEchoClient(String ip,int port) throws SocketException {//系统自动为客户端分配端口socket = new DatagramSocket();//记录ip和端口号this.ip = ip;this.port = port;
}

start()方法 

public static void start() throws IOException {System.out.println("客户端启动!");Scanner scanner = new Scanner(System.in);while (true){System.out.print("->");String request = scanner.next();//将读取到的字符串转化为请求报文,并用socket进行发送DatagramPacket requestPacket = new DatagramPacket(request.getBytes(),request.getBytes().length, InetAddress.getByName(ip),port);socket.send(requestPacket);//创建回应报文来接收响应DatagramPacket responsePacket = new DatagramPacket(new byte[1024],1024);socket.receive(responsePacket);//将响应报文转换成字符串,并打印出来String response = new String(responsePacket.getData(),0,responsePacket.getLength());System.out.println(response);}
}

相关文章:

【Java】网络编程-UDP回响服务器客户端简单代码编写

这一篇文章我们将讲述网络编程中UDP服务器客户端的编程代码 1、前置知识 UDP协议全称是用户数据报协议,在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议。 UDP的特点有:无连接、尽最大努力交付、面向报文、没有拥塞控制 本文讲…...

【设计模式】之工厂模式

工厂模式 1.介绍 工厂模式(创建型模式),是我们最常用的实例化对象模式,是用工厂方法代替new操作的一种模式;在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的…...

70.爬楼梯

题目描述 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 注意: 给定 n 是一个正整数。 示例 1: 输入: 2 输出: 2 解释: 有两种方法可以爬到楼顶…...

【论文解读】ICLR 2024高分作:ViT需要寄存器

来源:投稿 作者:橡皮 编辑:学姐 论文链接:https://arxiv.org/abs/2309.16588 摘要: Transformer最近已成为学习视觉表示的强大工具。在本文中,我们识别并表征监督和自监督 ViT 网络的特征图中的伪影。这些…...

【Redis】AOF 基础

因为 Redis AOF 的实现有些绕, 就分成 2 篇进行分析, 本篇主要是介绍一下 AOF 的一些特性和依赖的其他函数的逻辑,为下一篇 (Redis AOF 源码) 源码分析做一些铺垫。 AOF 全称: Append Only File, 是 Redis 提供了一种数据保存模式, Redis 默认不开启。 AOF 采用日志的形式来记…...

C语言—每日选择题—Day50

一天一天的更新,也是达到50天了,精选的题有250道,博主累计做了不下500道选择题,最喜欢的题型就是指针和数组之间的计算呀,不知道关注我的小伙伴是不是一直在坚持呢?文末有投票,大家可以投票让博…...

[C/C++]——内存管理

学习C/C的内存管理 前言:一、C/C的内存分布二、C语言中动态内存管理方式三、C中动态内存管理方式3.1、new/delete操作符3.1.2、new/delete操作内置类型3.1.3、new/delete操作自定义类型 3.2、认识operator new和operator delete函数3.3、了解new和delete的实现原理3…...

PDF文件的限制编辑,如何设置?

想要给PDF文件设置一个密码防止他人对文件进行编辑,那么我们可以对PDF文件设置限制编辑,设置方法很简单,我们在PDF编辑器中点击文件 – 属性 – 安全,在权限下拉框中选中【密码保护】 然后在密码保护界面中,我们勾选【…...

Linux 中使用 docker 安装 Elasticsearch 及 Kibana

Linux 中使用 docker 安装 Elasticsearch 及 Kibana 安装 Elasticsearch 和 Kibana安装分词插件 ik_smart 安装 Elasticsearch 和 Kibana 查看当前运行的镜像及本地已经下载的镜像,确认之前没有安装过 ES 和 Kibana 镜像 docker ps docker images从远程镜像仓库拉…...

在Flutter中使用PhotoViewGallery指南

介绍 Flutter中的PhotoViewGallery是一个功能强大的插件,用于在应用中展示可缩放的图片。无论是构建图像浏览器、相册应用,还是需要在应用中查看大图的场景,PhotoViewGallery都是一个不错的选择。 添加依赖 首先,需要在pubspec…...

c语言中的static静态(1)static修饰局部变量

#include<stdio.h> void test() {static int i 1;i;printf("%d ", i); } int main() {int j 0;while (j < 5){test();j j 1;}return 0; } 在上面的代码中&#xff0c;static修饰局部变量。 当用static定义一个局部变量后&#xff0c;这时局部变量就是…...

生信算法4 - 获取overlap序列索引和序列的算法

生信序列基本操作算法 建议在Jupyter实践&#xff0c;python版本3.9 1. 获取overlap序列索引和序列的算法实现 # min_length 最小overlap碱基数量3个 def getOverlapIndexAndSequence(a, b, min_length3):""" Return length of longest suffix of a matching…...

springboot 学习网站

Spring Boot 系列教程https://www.docs4dev.com/ Spring Boot 教程汇总 http://www.springboot.wiki/ Spring Cloud 微服务教程 http://www.springboot.wiki/ 1、自定义banner   https://www.cnblogs.com/cc11001100/p/7456145.html 2、事件和监听器   https://blog.csd…...

论文笔记:A review on multi-label learning

一、介绍 传统的监督学习是单标签学习&#xff0c;但是现实中一个实例可能对应多个标签。这篇文章介绍了多标签分类的定义和评价指标、多标签学习的算法还有其他相关的任务。 二、问题相关定义 2.1 多标签学习任务 假设 X R d X R^d XRd&#xff0c;表示d维的输入空间&am…...

接口文档 YAPI介绍

YAPI介绍 YAPI使用流程...

LeetCode 300最长递增子序列 674最长连续递增序列 718最长重复子数组 | 代码随想录25期训练营day52

动态规划算法10 LeetCode 300 最长递增子序列 2023.12.15 题目链接代码随想录讲解[链接] int lengthOfLIS(vector<int>& nums) {//创建变量result存储最终答案,设默认值为1int result 1;//1确定dp数组&#xff0c;dp[i]表示以nums[i]为结尾的子数组的最长长度ve…...

Improving IP Geolocation with Target-Centric IP Graph (Student Abstract)

ABSTRACT 准确的IP地理定位对于位置感知的应用程序是必不可少的。虽然基于以路由器为中心(router-centric )的IP图的最新进展被认为是前沿的,但一个挑战仍然存在:稀疏IP图的流行(14.24%,少于10个节点,9.73%孤立)限制了图的学习。为了缓解这个问题,我们将目标主机(ta…...

华为技面三轮面试题

1. 最长回文子串 -- 中心扩散法 给你一个字符串 s&#xff0c;找到 s 中最长的回文子串。 如果字符串的反序与原始字符串相同&#xff0c;则该字符串称为回文字符串。 示例 1&#xff1a; 输入&#xff1a;s "babad" 输出&#xff1a;"bab" 解释&…...

Linux arm架构下构建Electron安装包

上篇文章我们介绍 Electron 基本的运行开发与 windows 安装包构建简单流程&#xff0c;这篇文章我们从零到一构建 Linux arm 架构下安装包&#xff0c;实际上 Linux arm 的构建流程&#xff0c;同样适用于 Linux x86 环境&#xff0c;只不过需要各自的环境依赖&#xff0c;Linu…...

【CCF BDCI 2023】多模态多方对话场景下的发言人识别 Baseline 0.71 NLP 部分

【CCF BDCI 2023】多模态多方对话场景下的发言人识别 Baseline 0.71 NLP 部分 概述NLP 简介文本处理词嵌入上下文理解 文本数据加载to_device 函数构造数据加载样本数量 len获取样本 getitem 分词构造函数调用函数轮次嵌入 RobertaRoberta 创新点NSP (Next Sentence Prediction…...

Open UI5 源代码解析之736:CardBase.js

源代码仓库: https://github.com/SAP/openui5 源代码位置:src\sap.f\src\sap\f\CardBase.js CardBase.js 深度解析:在 OpenUI5 中承上启下的卡片基座 文件定位与整体判断 CardBase.js 位于 sap.f 库下,它不是面向业务开发者直接频繁实例化的组件,而是一个被多种卡片实…...

Android USB串口通信终极指南:智能家居物联网项目实战

Android USB串口通信终极指南&#xff1a;智能家居物联网项目实战 【免费下载链接】usb-serial-for-android Android USB host serial driver library for CDC, FTDI, Arduino and other devices. 项目地址: https://gitcode.com/gh_mirrors/us/usb-serial-for-android …...

嵌入式AI新篇章:Qwen3-ASR-0.6B在边缘计算设备上的部署与优化

嵌入式AI新篇章&#xff1a;Qwen3-ASR-0.6B在边缘计算设备上的部署与优化 1. 引言&#xff1a;当语音识别遇见边缘计算 想象一下&#xff0c;你对着一个巴掌大的智能音箱说话&#xff0c;它几乎在你话音落下的瞬间就理解了你的意思&#xff0c;并且完全不需要连接云端。或者&…...

避坑指南:微信支付V3 SDK自动更新证书失败的5种常见原因及修复方法

微信支付V3证书自动更新失败排查手册&#xff1a;从原理到实战修复 微信支付的V3版本SDK以其自动证书更新机制著称&#xff0c;但不少开发者在集成过程中都遭遇过AutoUpdateCertificatesVerifier的失败问题。证书更新失败不仅会导致支付功能中断&#xff0c;还可能引发验签错误…...

Vivado平台下PCIe IP核选型指南:从硬核到XDMA的实战抉择

1. PCIe技术基础与Vivado开发环境搭建 第一次接触PCIe接口开发时&#xff0c;我被各种专业术语搞得晕头转向。后来才发现&#xff0c;理解PCIe就像理解高速公路系统一样简单。PCIe本质上是一种点对点的高速串行总线&#xff0c;就像城市间修建的多车道高速公路。每个"车道…...

百川2-13B模型实战:Python爬虫数据的智能分析与摘要生成

百川2-13B模型实战&#xff1a;Python爬虫数据的智能分析与摘要生成 每天&#xff0c;互联网上都会产生海量的文本信息&#xff0c;新闻、论坛帖子、社交媒体动态……对于市场分析师、舆情监控人员或者内容运营者来说&#xff0c;如何从这些信息海洋中快速提炼出有价值的内容&…...

如何通过手机号快速查询QQ号:3分钟解决账号遗忘难题

如何通过手机号快速查询QQ号&#xff1a;3分钟解决账号遗忘难题 【免费下载链接】phone2qq 项目地址: https://gitcode.com/gh_mirrors/ph/phone2qq 在数字时代&#xff0c;QQ账号作为重要的社交和工作工具&#xff0c;其安全性与可访问性至关重要。然而&#xff0c;更…...

在GCP上运行autoresearch

Andrej Karpathy最近开源了autoresearch&#xff0c;这是一个将真实LLM训练环境交给AI代理并让它自主实验的项目。代理修改模型代码&#xff0c;训练恰好5分钟&#xff0c;检查验证损失是否改善&#xff0c;保留或丢弃更改&#xff0c;然后重复。你去睡觉&#xff1b;醒来时会看…...

AI读脸术多国面孔适配:跨种族识别优化部署实战

AI读脸术多国面孔适配&#xff1a;跨种族识别优化部署实战 1. 引言 你有没有遇到过这样的情况&#xff1a;一个在亚洲人脸识别上表现不错的AI模型&#xff0c;拿到一张欧洲人或非洲人的照片时&#xff0c;识别结果就开始"犯迷糊"了&#xff1f;性别判断出错&#x…...

仿真:H无穷鲁棒控制与for loop shaping在永磁同步电机伺服位置控制中的应用 - ...

仿真-H无穷鲁棒控制_for loop shaping-永磁同步电机伺服位置控制仿真:验证设计流程&#xff0c;送鲁棒控制设计资料包永磁同步电机的伺服位置控制总让人又爱又恨。这玩意儿响应快、精度高&#xff0c;但参数敏感得像刚恋爱的小姑娘。传统PID搞不定的时候&#xff0c;试试H无穷鲁…...