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

JavaEE初阶---网络原理/UDP服务器客户端程序

文章目录

  • 1.网络初识
  • 2.网络编程
    • 2.1TCP/UDP区别介绍
    • 2.2UDP的socket api使用
    • 2.3UDP协议里面的服务器客户端程序

1.网络初识

网络和计算机类似:都是属于军用====》民用;

网络诞生于美苏争霸时期,当时就感觉核战争一触即发,形式非常严峻;

下面的这个就是网络的发展的简单的历程以及对于这个基本的网络知识的一个说明;

image-20241027185007749

image-20241027190208964

2.网络编程

网络编程就是通过网络,让主机之间可以建立通信的过程;

进行网络编程的时候,我们的这个操作系统会提供成套的这个aip接口供我们进行使用,我们通过对于这些api 的调用才可以完成这些的网络编程的过程;

api就可以认为是这个应用层和我们的这个传输层之间进行交互的一个路径,这类api的全程就是socket api,通过这套api接口,我们可以实现不同主机之间的这个不同系统之间的网络通信的过程;

传输层提供网络协议主要是两个,就是TCP/UDP协议,这两个协议之间的这个差别很大,我们使用这两套api进行网络编程的时候也是会存在较大的区别的;

2.1TCP/UDP区别介绍

image-20241028131550539

1,有链接和无连接:就是TCP协议进行传输的时候,需要首先保存对方的信息,就是我们的这个发送方知道我们的这个信息会发给谁,我们的接收方知道这个信息是谁发过来的;

但是我们的这个UDP就不会这样确认保存对方的信息了,不需要征求对方的同意,而是会直接进行这个数据的发送,UDP在进行发送的时候也不会保存这个对方的信息;(但是我们写这个程序的程序员需要知道这个信息会发送给谁,我们调用这个socket api接口的时候,就会把这个发送位置信息传递过去);

2.可靠传输和不可靠传输:就是类似于这个医生看病,我们的这个医生对于一个病人的这个病情进行治疗的时候不会保证这个病人一定可以治疗好,或者是其他的,但是这个医生自己是有数的;

同上面的这个案例相似,我们的上面的这个TCP/UDP进行信息的传输的时候,TCP发送数据的时候,能不能发送成功他自己心里是有数的,虽然不是100%确定,但是自己并不是完全没有把握;

因此我们的这个TCP是内置这个可靠传输的协议的,但是我们的这个UDP是没有内置可靠传的,但是这个可靠传输的结果就是我们的这个传输的过程很繁琐,而且这个传输的效率很低;

3.字节流和数据报:字节流可以进行灵活的读写,这个就是TCP传输所面向的,但是我们的这个UDP是面向这个数据包传输的,一个UDP数据报是由很严格的格式的;

网络上面的数据通信的基本单位的几个不同的说法,虽然不同,但是我们一般会混用:

数据报:datagram

数据包:packet

数据帧:frame

数据段:segment

4.全双工的:一个信道可以进行双向的通信,如果是只能进行单向的通信,这个时候就是半双工的;

2.2UDP的socket api使用

datagramsocket:socket实际上也是我们的操作系统里面的概念,我们的这个socket实际上就是硬件里面的“网卡”的一个抽象;

我们往这个socket文件里面写数据实际是通过网卡发送数据,通过socket文件读数据就是通过网卡接收数据;

java里面有这个datagramsocket类表示系统内部的socket文件,本质上这个socket就是一个文件,对于这个socket的操作,实际上就是我们的这个网卡进行发送和接收数据;

这个类里面由receive,send,close等方法,我们的这个方法的参数就是我们的datagrampacket这个类,这个datagrampacket表示的就是我们的UDP的数据包

datagrampacket:上面说了这个就是数据报,这个是进行传输的基本单位:

我们下面就是实现一个简单的UDP的客户端/服务器通信的程序,这个程序没有任何的业务逻辑,只是单纯的调用这个socket api,让我们的客户端发送请求,请求就是从这个控制台进行字符串的输入,服务器接收到这个字符串之后,就会把这个字符串原封不动的返回给我们的客户端,客户端会显示出来;

因为上面的这个服务器用户发送什么,我们的这个服务器就是会返回什么到客户端,因此这样的服务器被称之为回显服务器

2.3UDP协议里面的服务器客户端程序

下面的这个是UDP的服务器端的程序:

import javax.xml.crypto.Data;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
@SuppressWarnings({"all"})
//下面的这个就是我们的服务器程序代码编写
public class UdpEchoServer {//首先创建一个dtatsocket对象,这个是我们操作网卡的基础private DatagramSocket socket = null;public UdpEchoServer(int port) throws SocketException {//下面的这个就是对于端口进行手动的指定socket = new DatagramSocket(port);//下面的这个就是自动分配端口,客户端自动分配端口,我们的服务器的端口需要制定//socket = new DatagramSocket();}public void start() throws IOException {System.out.println("服务器启动!!!");//一个服务器程序里面经常会看到这个while(true)这样的代码//服务器程序经常需要长时间运行,我们不知道客户端什么时候有请求while(true){/*** 1.读取请求并且进行解析*requestPacket需要对于接受的数据进行保存,但是这个datagrampacket无法自己分配内存,需要我们分配*我们的这个服务器一旦启动,我们这个receive就会被执行到,如果这个时候我们的客户端的请求没有来* 我们这个时候的receive就会进入阻塞的状态,直到我们接受到请求*/DatagramPacket requestPacket = new DatagramPacket(new byte[4096],4096);socket.receive(requestPacket);/*** 2.我们接受到这个数据是二进制数据,想要显示出来,需要进行转换* 0,requestPacket.getLength这个空间里面的字节被取出来转换为这个字符串* 这个getlength得到的结果不是上面指定的这个4096,而是这个里面真是的存储数据的真实空间长度* 主要是取决于我们的这个发送方发送数据的多少*/String request = new String(requestPacket.getData(),0,requestPacket.getLength());/*** 3.下面的这个就是根据请求计算响应,因为我们的这个回显服务器就是直接把这个请求作为响应,所以基本上没咋处理*/String response=process(request);/*** 下面的这个就是把我们的响应写回到客户端,创建响应的对象*/DatagramPacket responsePacket = new DatagramPacket(response.getBytes(),response.getBytes().length,requestPacket.getSocketAddress());socket.send(responsePacket);/*** 4.进行日志的打印,把这个响应的相应信息打印出来*/System.out.printf("[%s:%d] rep=%s,resp=%s\n",requestPacket.getAddress().toString(),responsePacket.getPort(),request,response);}}public String process(String response){return response;}public static void main(String[] args) throws IOException {UdpEchoServer server = new UdpEchoServer(9090);server.start();}
}

下面的这个就是UDP的客户端程序:

import java.io.IOException;
import java.net.*;
import java.util.Scanner;@SuppressWarnings({"all"})
public class UdpEchoClient {private DatagramSocket socket = null;private String serverIp="";private int serverPort=0;public UdpEchoClient(String ip,int port) throws SocketException {//创建对象,但是不要手动指定端口socket=new DatagramSocket();/*** 因为我们的这个UDP协议不会保存对方的信息,,因此在我们的这个里面需要把ip信息记录下来*/serverIp=ip;serverPort=port;}public void start() throws IOException {System.out.println("客户端启动!!!");Scanner scanner = new Scanner(System.in);while(true){System.out.println("->");String request=scanner.next();//把请求内容构建对象,发送给服务器DatagramPacket requestPacket = new DatagramPacket(request.getBytes(),request.getBytes().length, InetAddress.getByName(serverIp),serverPort);socket.send(requestPacket);//尝试读取服务器返回的响应DatagramPacket responsePacket = new DatagramPacket(new byte[4096],4096);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("192.168.137.0",9090);client.start();}

我们的这个执行的逻辑就是我们的这个服务器先启动,然后我们的客户端输入,服务器接受之后进行解析,返回响应(其实就是我们的输入的内容,因为这个是回显服务器),客户端接收响应,并且打印这个响应的内容;

我们的这个程序其他人还是访问不到的,除非我们在一个局域网上面,我们后面可以部署到这个云服务器上面,这样其他的人也是可以登陆的~~

相关文章:

JavaEE初阶---网络原理/UDP服务器客户端程序

文章目录 1.网络初识2.网络编程2.1TCP/UDP区别介绍2.2UDP的socket api使用2.3UDP协议里面的服务器客户端程序 1.网络初识 网络和计算机类似:都是属于军用》民用; 网络诞生于美苏争霸时期,当时就感觉核战争一触即发,形式非常严峻…...

每天10个vue面试题(六)

1、对Vue设计原则的理解? 渐进式JavaScript框架:与其它大型框架不同的是,Vue被设计为可以自底向上逐层应用。Vue的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现代化…...

Qt:信号和槽

目录 关于信号 connect函数 关于connect connect的使用 自定义信号、自定义槽 自定义槽 第一种方式自定义槽 第二种方式自定义槽 自定义信号 信号槽 带参数的信号槽 参数个数一致的示例 参数个数不一致的示例 Q_OBJECT 信号和槽存在的意义 disconnect函数 使用…...

可以免费商用的字体下载

这里介绍一个开源仓库,收录的可以免费商用的字体,目前中文字体1308款,英文字体980款,共约2288多款字体。 Description Free fonts that can be used commercially.There are currently 1308 Chinese fonts and 980 English font…...

centos7之LVS-TUNNEL模式

介绍 优缺点以及适用场景 优点:能负载更多的Realserver减轻LB的压力。LVS和Realserver可以不再同一网段。 缺点:tun模式的开销比较大(出口流量大),性能不如DR模式。不支持端口转发。后端Realserver系统必须支持tunnel协议。 适用&#xff…...

Linux驱动开发(3):字符设备驱动

上一章节我们了解到什么是内核模块,模块的加载卸载详细过程以及内核模块的使用等内容。 本章,我们将学习驱动相关的概念,理解字符设备驱动程序的基本框架,并从源码上分析字符设备驱动实现和管理。 主要内容有如下五点:…...

刘艳兵-DBA023-控制文件是Oracle 数据库用来查找数据库文件,控制文件包含以下哪些信息:

控制文件是Oracle 数据库用来查找数据库文件,控制文件包含以下哪些信息: A 表空间信息 B 创建数据库的时间戳 C 有关数据文件、 联机重做日志文件、和归档重做日志文件的信息 D 数据库名称和数据库唯一标识符(DBID) E RMAN备份…...

Vue Scoped CSS深度解析:原理、误区与最佳实践

引言 在Vue开发中,Scoped CSS是一个强大而复杂的功能。它允许我们将样式限制在特定组件内,但同时也带来了一些细微的行为,可能导致意外的样式"泄漏"。本文将深入探讨Vue Scoped CSS的工作原理,解释常见的误区&#xff…...

744. 寻找比目标字母大的最小字母

目录 题目解法一解法二如何比较字符串letters.back()*upper_bound为什么要加* 题目 给你一个字符数组 letters,该数组按非递减顺序排序,以及一个字符 target。letters 里至少有两个不同的字符。 返回 letters 中大于 target 的最小的字符。如果不存在这…...

浅谈QT中Tab键的切换逻辑

浅谈QT中Tab键的切换逻辑 无意中发现在输入界面中按下Tab键时,没有按照预想的顺序切换焦点事件,如下图所示 这个现象还是很有趣,仔细观察了下,默认的切换顺序是按照控件拖入顺序,那么知道了这个问题想要解决起来就很简…...

基于MoviNet检测视频中危险暴力行为

项目源码获取方式见文章末尾! 600多个深度学习项目资料,快来加入社群一起学习吧。 《------往期经典推荐------》 项目名称 1.【Faster & Mask R-CNN模型实现啤酒瓶瑕疵检测】 2.【卫星图像道路检测DeepLabV3Plus模型】 3.【GAN模型实现二次元头像生…...

《等保测评:抵御网络威胁的盾牌》

在网络空间的无垠战场上,网络安全威胁如同暗夜之狼,潜伏在每一个角落,随时准备对企业和个人发动致命一击。在这场没有硝烟的战争中,等保测评作为国家网络安全等级保护制度的重要组成部分,犹如坚固的盾牌,为…...

前端必知必会-JavaScript 对象属性

文章目录 JavaScript 对象属性访问 JavaScript 属性添加新属性删除属性嵌套对象 总结 JavaScript 对象属性 对象是无序的属性集合 属性是 JavaScript 对象中最重要的部分。 属性可以更改、添加、删除,有些属性是只读的。 访问 JavaScript 属性 访问对象属性的语…...

双11都有什么值得入手的好物?双十一最建议买的5样东西

双11的脚步逐步渐近,我们点开各大电商平台也可以看到,各个商家已经开始大激烈的促销大战,那么双十一作为一年之中最盛大的购物节,都有什么值得入手的好物呢?今天就给大家建议买的5样东西,从家电好物到生活用…...

Xcode 15.4 运行flutter项目,看不到报错信息详情?

Xcode升级后,遇到了奇怪的事情: 运行flutter项目,左侧栏显示有报错信息,但是点击并没有跳转出具体的error详情。【之前都会自己跳转出来的,升级后真的是无厘头】 方案: 点击左侧导航栏最右边的图标——>…...

AMD开始为基于RDNA的GPU开发自己的神经超采样和去噪技术

NVIDIA 的升级技术已经取得了长足的进步,这些技术解决了现代游戏在开启光线追踪时在苛刻场景中的性能问题。NVIDIA 开始实施各种光线追踪和升级技术后,AMD 和英特尔也紧随其后,推出了自己的 FSR 和 XeSS 升级方法。据报道,AMD 将跟…...

Python中的文件I/O操作

在Python编程中,文件I/O(输入/输出)是一个重要的主题,涉及如何读取和写入文件。无论是处理文本文件还是二进制文件,Python提供了简洁易用的接口。本文将介绍如何在Python中进行文件I/O操作,包括读取、写入和…...

.net framework 3.5sp1开启错误进度条不动如何解决

浏览器地址栏输入www.dnz9.com远程解决netframework问题 在Windows操作系统上安装或启用.NET Framework 3.5 SP1时,如果遇到进度条不动的问题,可能由多种原因引起。以下是一些可能的解决方案: 1. 使用Windows功能对话框 1.打开“控制面板”。…...

什么影响网站的SEO排名

1.多IP多C段配置:海外站群服务器通常提供多IP多C段配置,这使得网站可以拥有多个独立的IP地址,有效避免同一IP下多个网站之间的关联性问题,降低被搜索引擎认为是站群作弊的风险。通过将不同的内容部署在不同的IP地址和C段上&#x…...

css绘制s型(grid)

在之前有通过flex布局实现了s型布局&#xff0c;是通过截取数组形式循环加载数据 这次使用grid直接加载数据通过css实现 <div id"app"><template v-for"(item,inx) in items"><div class"row"><template v-for"(ite…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

pam_env.so模块配置解析

在PAM&#xff08;Pluggable Authentication Modules&#xff09;配置中&#xff0c; /etc/pam.d/su 文件相关配置含义如下&#xff1a; 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块&#xff0c;负责验证用户身份&am…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...

《C++ 模板》

目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板&#xff0c;就像一个模具&#xff0c;里面可以将不同类型的材料做成一个形状&#xff0c;其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式&#xff1a;templa…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...