当前位置: 首页 > 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…...

【华为HCIP实战课程二十八】中间到中间系统协议IS-IS邻居关系排错,网络工程师

一、ISIS邻居关系条件 1、同一层次(比如Level-2路由器不能和Level-1路由器形成邻居关系) 2、同一区域(L1必须同一区域) 3、同一网段 R1和R2之间分别配置如下IP地址和掩码: R1 的接口S1/0/0掩码为/24 R2的接口S1/0/0配置成掩码/28: 此时R1和R2依然可以建立ISIS邻居关系…...

Word首行空格不显示空格符号问题

Word段落首行空格设置指南 问题描述 在Word中编辑文档时&#xff0c;有时会遇到段落首行敲击空格键却不显示空格的问题。这通常与Word的自动更正设置有关。 解决方法 要解决此问题&#xff0c;需要调整Word的自动更正设置。具体步骤如下&#xff1a; 打开Word的"自动更…...

vue+element上传图片

一、html页面上传图片 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> <…...

用ChatGPT提升工作效率:从理论到实际应用

伴人工智能技术的迅速演进&#xff0c;像ChatGPT这类语言模型已成为提升工作效率的关键工具。这类模型不仅具备处理海量数据的能力&#xff0c;还能自动化许多日常任务&#xff0c;从而提高决策的准确性。本文将深入探讨如何在工作中利用ChatGPT等AI工具提升效率&#xff0c;涵…...

8、Node.js Express框架

五、Express框架 5.1概念 Express框架是一个基于Node.js平台的极简、灵活的WEB开发框架:www.express.com.cn 简单来说,Express是一个封装好的工具包,封装了很多功能,便于我们开发WEB应用 5.2安装 npm i express5.3 Express初体验 //01-express初体验.js //1.导入exrp…...

STM32F103C8T6学习笔记3--按键控制LED灯

1、实验内容 S4、S5分别接PB12和PB13&#xff0c;实验要求&#xff0c;按下S4&#xff0c;D1亮&#xff0c;D2灭&#xff1b;按下S5&#xff0c;D2亮&#xff0c;D1灭。 由于按键学习的是GPIO口的输入功能&#xff0c;和输出功能的配置略有区别。本次通过按键触发相应功能没有…...

Unity3D Shader实现法线贴图功能详解

在Unity3D中&#xff0c;Shader是一种强大的工具&#xff0c;可以帮助开发人员实现各种复杂的视觉效果&#xff0c;其中法线贴图功能就是其中之一。法线贴图是一种纹理映射技术&#xff0c;通过在模型表面上放置法线贴图纹理来模拟真实世界中的细节和凹凸&#xff0c;使模型看起…...

【含开题报告+文档+源码】基于SpringBoot+Vue的校园设备报修系统

开题报告 随着高校规模的不断扩大和设施设备的日益完善&#xff0c;传统的校园设备报修方式已经无法满足日益增长的维修需求。这种方式往往存在信息不准确、报修流程冗长、反馈不及时等问题&#xff0c;给高校维修工作带来了很大的困扰。为了提高设备故障处理的效率和准确性&a…...

电赛入门之软件stm32keil+cubemx

hal库可以帮我们一键生成许多基本配置&#xff0c;就不需要自己写了&#xff0c;用多了hal库就会发现原来用基本库的时候都过的什么苦日子&#xff08;笑 下面我们以f103c8t6&#xff0c;也就是经典的最小核心板来演示 一、配置工程 首先来新建一个工程 这里我们配置rcc和sys&…...

STM32F103C8T6学习笔记2--LED流水灯与蜂鸣器

1、简要说明与电路图 LED灯与蜂鸣器都是GPIO的输出操作&#xff0c;给高低电平实现。GPIO操作也是后续操作的基础&#xff0c;没有什么难度&#xff0c;记不住寄存器没关系&#xff0c;只要把流程理清楚就可以了。 端口配置成推挽输出模式&#xff0c;高低电平均有驱动能力。 …...