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

网站SEO推广需要多少钱_如何选择合适的网站 SEO 推广服务商

网站SEO推广需要多少钱_如何选择合适的网站 SEO 推广服务商 一、了解网站SEO推广的基本概念 在当今的数字时代&#xff0c;网站SEO推广&#xff08;Search Engine Optimization&#xff0c;搜索引擎优化&#xff09;已成为任何企业在互联网上获得流量和客户的关键手段之一。S…...

细说杨乃武与小白菜案

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言一、案件二、精神分析学---心理防御机制三、关于我自己总结前言 一、案件 略&#xff0c;后面补 二、精神分析学—心理防御机制 在这个案件我主要关注县令和小…...

3步实现微信聊天记录永久保存与智能分析的完整方案

3步实现微信聊天记录永久保存与智能分析的完整方案 【免费下载链接】WeChatMsg 提取微信聊天记录&#xff0c;将其导出成HTML、Word、CSV文档永久保存&#xff0c;对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/WeChatMsg 在数…...

程序员别再假装养生:你花3000块买保健品,却舍不得戒掉这3个坏习惯

深夜十一点&#xff0c;某程序员群突然炸了。有人发了张截图&#xff0c;是他双十一的购物记录&#xff1a;护肝片、维生素C、鱼油、钙片、褪黑素、护腰垫、人体工学鼠标......总价&#xff1a;6872元。底下评论清一色的"对自己好一点"、"程序员太难了"、&…...

Comfyui从入门到进阶教程分享

接触Comfyui的这段时间&#xff0c;从最开始的安装部署踩坑&#xff0c;到后来独立搭建自定义工作流&#xff0c;试过不少零散的教程&#xff0c;也整理了一套成体系的学习内容&#xff0c;覆盖了从基础操作到高阶玩法的各个环节&#xff0c;不管是刚入门的新手&#xff0c;还是…...

Zotero CitationCounts:学术引用追踪与文献影响力分析的高效工具

Zotero CitationCounts&#xff1a;学术引用追踪与文献影响力分析的高效工具 【免费下载链接】zotero-citationcounts Zotero plugin for auto-fetching citation counts from various sources 项目地址: https://gitcode.com/gh_mirrors/zo/zotero-citationcounts Zote…...

如何让《十字军之王II》完美支持中文:双字节字符补丁全面解析

如何让《十字军之王II》完美支持中文&#xff1a;双字节字符补丁全面解析 【免费下载链接】CK2dll Crusader Kings II double byte patch /production : 3.3.4 /dev : 3.3.4 项目地址: https://gitcode.com/gh_mirrors/ck/CK2dll 《十字军之王II》双字节字符补丁是一款专…...

GTE-Pro企业级语义智能实战:从模型加载到热力评分可视化的完整链路

GTE-Pro企业级语义智能实战&#xff1a;从模型加载到热力评分可视化的完整链路 1. 引言&#xff1a;告别关键词匹配&#xff0c;拥抱语义理解 想象一下&#xff0c;你是一个新员工&#xff0c;想查一下公司怎么报销餐费。你打开公司的知识库&#xff0c;输入“怎么报销吃饭的…...

SOLOv2的‘动态’内核与‘矩阵’NMS:深入代码看它如何比SOLO快3倍

SOLOv2动态内核与矩阵NMS的工程实现奥秘 在计算机视觉领域&#xff0c;实例分割一直是一个极具挑战性的任务&#xff0c;它要求模型不仅要检测出图像中的每个对象&#xff0c;还要精确地描绘出每个对象的轮廓。SOLO系列算法作为这一领域的创新者&#xff0c;从v1到v2的演进中展…...

STM32单片机NRST管脚异常复位问题解析与EMC设计优化

1. STM32单片机NRST管脚异常复位问题解析最近在客户现场遇到一个棘手的STM32G474单片机异常复位问题&#xff0c;发生在EMS浪涌测试过程中。作为嵌入式开发者&#xff0c;复位问题往往是最让人头疼的故障之一。今天我就把这个案例的完整排查过程和解决方案分享给大家&#xff0…...