JavaEE初阶---网络原理/UDP服务器客户端程序
文章目录
- 1.网络初识
- 2.网络编程
- 2.1TCP/UDP区别介绍
- 2.2UDP的socket api使用
- 2.3UDP协议里面的服务器客户端程序
1.网络初识
网络和计算机类似:都是属于军用====》民用;
网络诞生于美苏争霸时期,当时就感觉核战争一触即发,形式非常严峻;
下面的这个就是网络的发展的简单的历程以及对于这个基本的网络知识的一个说明;


2.网络编程
网络编程就是通过网络,让主机之间可以建立通信的过程;
进行网络编程的时候,我们的这个操作系统会提供成套的这个aip接口供我们进行使用,我们通过对于这些api 的调用才可以完成这些的网络编程的过程;
api就可以认为是这个应用层和我们的这个传输层之间进行交互的一个路径,这类api的全程就是socket api,通过这套api接口,我们可以实现不同主机之间的这个不同系统之间的网络通信的过程;
传输层提供网络协议主要是两个,就是TCP/UDP协议,这两个协议之间的这个差别很大,我们使用这两套api进行网络编程的时候也是会存在较大的区别的;
2.1TCP/UDP区别介绍

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协议。 适用ÿ…...
Linux驱动开发(3):字符设备驱动
上一章节我们了解到什么是内核模块,模块的加载卸载详细过程以及内核模块的使用等内容。 本章,我们将学习驱动相关的概念,理解字符设备驱动程序的基本框架,并从源码上分析字符设备驱动实现和管理。 主要内容有如下五点:…...
刘艳兵-DBA023-控制文件是Oracle 数据库用来查找数据库文件,控制文件包含以下哪些信息:
控制文件是Oracle 数据库用来查找数据库文件,控制文件包含以下哪些信息: A 表空间信息 B 创建数据库的时间戳 C 有关数据文件、 联机重做日志文件、和归档重做日志文件的信息 D 数据库名称和数据库唯一标识符(DBID) E RMAN备份…...
Vue Scoped CSS深度解析:原理、误区与最佳实践
引言 在Vue开发中,Scoped CSS是一个强大而复杂的功能。它允许我们将样式限制在特定组件内,但同时也带来了一些细微的行为,可能导致意外的样式"泄漏"。本文将深入探讨Vue Scoped CSS的工作原理,解释常见的误区ÿ…...
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型布局,是通过截取数组形式循环加载数据 这次使用grid直接加载数据通过css实现 <div id"app"><template v-for"(item,inx) in items"><div class"row"><template v-for"(ite…...
【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...
永磁同步电机无速度算法--基于卡尔曼滤波器的滑模观测器
一、原理介绍 传统滑模观测器采用如下结构: 传统SMO中LPF会带来相位延迟和幅值衰减,并且需要额外的相位补偿。 采用扩展卡尔曼滤波器代替常用低通滤波器(LPF),可以去除高次谐波,并且不用相位补偿就可以获得一个误差较小的转子位…...
解析两阶段提交与三阶段提交的核心差异及MySQL实现方案
引言 在分布式系统的事务处理中,如何保障跨节点数据操作的一致性始终是核心挑战。经典的两阶段提交协议(2PC)通过准备阶段与提交阶段的协调机制,以同步决策模式确保事务原子性。其改进版本三阶段提交协议(3PC…...
大数据驱动企业决策智能化的路径与实践
📝个人主页🌹:慌ZHANG-CSDN博客 🌹🌹期待您的关注 🌹🌹 一、引言:数据驱动的企业竞争力重构 在这个瞬息万变的商业时代,“快者胜”的竞争逻辑愈发明显。企业如何在复杂环…...
精益数据分析(98/126):电商转化率优化与网站性能的底层逻辑
精益数据分析(98/126):电商转化率优化与网站性能的底层逻辑 在电子商务领域,转化率与网站性能是决定商业成败的核心指标。今天,我们将深入解析不同类型电商平台的转化率基准,探讨页面加载速度对用户行为的…...
用js实现常见排序算法
以下是几种常见排序算法的 JS实现,包括选择排序、冒泡排序、插入排序、快速排序和归并排序,以及每种算法的特点和复杂度分析 1. 选择排序(Selection Sort) 核心思想:每次从未排序部分选择最小元素,与未排…...
第22节 Node.js JXcore 打包
Node.js是一个开放源代码、跨平台的、用于服务器端和网络应用的运行环境。 JXcore是一个支持多线程的 Node.js 发行版本,基本不需要对你现有的代码做任何改动就可以直接线程安全地以多线程运行。 本文主要介绍JXcore的打包功能。 JXcore 安装 下载JXcore安装包&a…...
使用ch340继电器完成随机断电测试
前言 如图所示是市面上常见的OTA压测继电器,通过ch340串口模块完成对继电器的分路控制,这里我编写了一个脚本方便对4路继电器的控制,可以设置开启时间,关闭时间,复位等功能 软件界面 在设备管理器查看串口号后&…...
