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

Java网络编程(下)

White graces:个人主页

🙉专栏推荐:Java入门知识🙉

🙉 内容推荐:Java网络编程🙉

🐹今日诗词:姑苏城外寒山寺,夜半钟声到客船🐹


⛳️点赞 ☀️收藏⭐️关注💬卑微小博主🙏

⛳️点赞 ☀️收藏⭐️关注💬卑微小博主🙏


目录

网络编程套接字

套接字

TCP和UDP区别

有连接和无连接

可靠和不可靠传输

面向字节流和面向数据报

全双工和半双工

UDP数据报套接字编程

回显服务器

服务端

客户端

公网IP和私网IP

字典服务器

美图分享


网络编程套接字

套接字

socket就是网络编程的套接字, 可以认为是网络编程API的统称

操作系统提供的套接字不止一种, 常见的三种

1. 流式套接字 -> 给TCP使用

2. 数据报套接字 -> 给UDP使用

3. Unix域套接字(很少使用了) -> 不能跨主机通信, 只能本地主机上的进程和进程通信

TCP和UDP协议都是传输层协议, 都是服务于应用层

但是这两协议的差别去很大, 因此我们需要两套API分别去使用它们

TCP和UDP区别

总结概括就是

TCP: 有连接, 可靠传输, 面向字节流, 全双工

UDP: 无连接, 不可靠传输, 面向数据报, 全双工

有连接和无连接

TCP有连接: 比如打电话, 电话打通了才能说话, 可以选择接听, 也可以不接听

UDP无连接: 发短信微信, 对方不需要接通, 可以直接发送

有连接的特点: 通信双方保存了对方的信息

无连接的特点: 通信双方不需要保存对方的信息

可靠和不可靠传输

可靠传输 != 绝对安全, 只是尽可能保持数据不会丢失, 传输的过程可能会出现丢包

丢包: A向B传输10个数据, 但是中途经过很多交换机和路由器, 到B手中可能只剩下9个数据流了

TCP可靠传输: 尽量保持数据在传输中不丢失

UDP不可靠传输: 传输数不管对方有没有收到, 反正我发了

可靠传输也是有代价的, 传输效率会大打折扣

面向字节流和面向数据报

TCP面向字节流: 传输数据的基本单位是字节, 文件操作就是字节流, 像水流一样, 文件读写都非常灵活, TCP也是如此

UDP面向数据报: 传输数据的基本单位是UDP数据报, 一次读写必须读写一个完整的数据报, 不能缺斤少两, 不能多读多写

网络传输数据的基本单位

有四个, 数据报, 数据段, 数据包, 数据帧, 但一般不会过于区分, 都是混着用, 毕竟他们都是传输数据的基本单位, 硬要区分的话就是下面这样

1. 数据报DataGram  (UDP传输的基本单位)

2. 数据段Segment  (TCP)

3. 数据包 Packet  (IP)

4. 数据帧 Frame   (数据链路层)

全双工和半双工

全双工: 一条链路能够进行双向通信

半双工: 一条链路只能进行单向通信

TCP和UDP都是全双工

全双工特点: 使用socket对象时, 既可以读(接收)又可以写(发送)

半双工特点: 不能同时读和写, 只能进行其中一项

UDP数据报套接字编程

DatagramSocket: 这个类用于UDP数据报进行网络通信

DatagramPacket: 这个类封装数据报的类, 相当于将数据报包装成了一个类

一个形象的例子理解二者区别: 

如果把UDP网络通信比作送快递的话, DatagramSocket相当于快递员, DatagramPacket相当于包裹 

DatagramSocket负责管理和创建套接字(相当于快递员), 可以用来接收或者发送数据报(包裹), DatagramPacket类用于封装要发送或者接收的信息及目标地址和端口信息(相当于包裹), 可以被DatagramSocket发送或者接收

DatagramSocket构造方法

DatagramSocket(int port) : port是手动指定的端口号, 大小在0-->65535

DatagramSocket() : 无参数版本, 系统会随机指定一个端口号

DatagramPacket构造方法

DatagramPacket( byte[] buf, int length ) : 表示创建了一个名为buf的缓冲区, DatagramPacket只能使用length长度的缓冲区大小, 这种写法很奇怪, 比如这样: 

为什么要有缓冲区: 

如果客户端请求直接发送给服务端, 数量非常多时, 服务端压力会非常大,IO会非常频繁

可能会导致服务器挂了, 如果有一个缓冲区, 服务器可以不用那么及时去处理请求

大大减轻了服务器的压力, 同时存在缓冲区, 可以降低客户端和服务端的耦合性

回显服务器

服务端

我们直接来看服务端代码, 我在代码里加了注释, 建议复制粘贴到自己的编译器去看

import java.io.IOException;
import java.net.*;public class UDPSever {private DatagramSocket socket = null;public UDPSever(String IP, int port)  throws IOException {socket = new DatagramSocket(port);}public void start() throws IOException{System.out.println("服务器, 启动!");while (true) {DatagramPacket requestPacket = new DatagramPacket(new byte[4096], 4096);//创建了一个4096大小的缓冲区, DatagramPacket能使用缓冲区的大小为4096socket.receive(requestPacket);//DatagramSocket接收请求, receive可能会出现异常, 网络请求和响应也IO的一种抛出IOException异常即可//如果没有请求, receive就会自动阻塞, 阻塞到客户端发送请求为止String request = new String(requestPacket.getData(),0, requestPacket.getLength());//这里就是解析数据了//由于数据报都是二进制数据,我们将他转化成字符串数据, 便于观察//getData()是获取整个缓冲区的数据, getLength()获取实际有效数据长度String response = responsemethod(request);//服务器响应请求DatagramPacket responsePacket  = new DatagramPacket(response.getBytes(),0, response.getBytes().length,requestPacket.getSocketAddress());//构建响应数据报, 将响应的数据封装成数据报, 然后由服务器发送//数据报包含: 有效数据内容, 客户端地址, 端口号//getSocketAddress()可以获取完整的套接字信息, 包括IP信息端口号//getAddress只获取IP信息socket.send(responsePacket);//将数据报发送会客户端System.out.printf("日志: [%s:%d] requset = %s response = %s\n",requestPacket.getAddress(), requestPacket.getPort(), request, response);//打印日志, System.out.printf(),可以像C语言一样, 格式化输出//System.out.println("[%s:%d]\n", requestPacket.getAddress(), requestPacket.getPort());//sout以ln结尾的不能格式化输出代码, System.out.println("%d", 5);像这种写法就是错的}}private String responsemethod(String request) {return request;//因为这里是模拟客户端和服务端, 所以响应我们写的简单点//客户端发送什么, 我们就原封不动的发送回去, 这种方式叫回显}public static void main(String[] args) throws IOException {UDPSever udpSever = new UDPSever("127.0.0.1", 9090);udpSever.start();}
}

客户端

import java.io.IOException;
import java.net.*;
import java.util.Scanner;
public class UDPClient {public DatagramSocket socket = null;private String SeverIP;//服务器的IPprivate int SeverPort;//服务器的端口号public UDPClient(String SeverIP, int SeverPort) throws SocketException {socket = new DatagramSocket();//系统随机分配客户端端口号//为什么不手动指定客户端端口号呢?因为服务器端口号固定,客户端才能找到,//如果服务器端口号经常变,就会非常麻烦,但是服务器并不需要关注客户端的端口号this.SeverIP = SeverIP;this.SeverPort = SeverPort;}public void start() throws IOException {System.out.println("客户端, 启动!");while (true) {Scanner scanner = new Scanner(System.in);System.out.println("请输入你要发送的请求: ");String request = scanner.next();DatagramPacket requestPacket = new DatagramPacket(request.getBytes(),0, request.getBytes().length,InetAddress.getByName(SeverIP), SeverPort);//构建请求数据报,包含有效数据, 服务器IP地址, 服务器端口号//SecerIP是字符串, 需要转成服务器能够识别的类型,// 我们也可以在创建IP的时候就传入InetAddress类型的,但这是给编译器看的,不方便我们理解socket.send(requestPacket);//客户端发送数据报到服务器DatagramPacket responsePacket= new DatagramPacket(new byte[4096], 4096);//用于存放响应信息socket.receive(responsePacket);//接收响应信息String response = new String(responsePacket.getData(), 0, responsePacket.getData().length);System.out.print(response);}}public static void main(String[] args) throws IOException {UDPClient udpClient = new UDPClient("127.0.0.1", 9090);udpClient.start();}
}

运行结果

公网IP和私网IP

每台电脑都有对应的IP, 但这并不意味着你知道了对方的IP就可以随意连接对方, 必须是公网IP才能够连接对方,如果不是公网IP, 还要连接对方, 你就需要和服务器在同一个局域网下才可以, 有点类似于开热点

私网IP和公网IP概念

私网IP: 地址满足(1)   10.*开头

                           (2)   172.16 -- 172.31*开头

                           (3)    192.168.*开头

满足这些开头的IP地址是私网地址, 其余都是公网IP地址

字典服务器

字典服务器: 输入英文单词, 返回对应的中文单词

这个很好实现, 就是在前面的回显服务器的基础上, 将响应方法改一下即可

因此我们的字典服务器直接继承UDPSever服务器类即可,然后重新里面的回显方法

import java.io.IOException;
import java.util.HashMap;public class UDPdictionarySever extends UDPSever {HashMap<String, String> dictionary = null;public UDPdictionarySever(String IP, int port) throws IOException {super(IP, port);dictionary = new HashMap<>();dictionary.put("hello", "你好");dictionary.put("world", "世界");dictionary.put("dog", "小狗");dictionary.put("cat", "小猫");dictionary.put("pig", "GGBond我的男神GGBond");}@Overridepublic String responsemethod(String request) {return dictionary.getOrDefault(request, "该单词没有对应的中文");}public static void main(String[] args) throws IOException {UDPdictionarySever udPdictionarySever = new UDPdictionarySever("127.0.0.1", 9090);udPdictionarySever.start();}
}

注意事项

运行效果


美图分享

✨🎆谢谢你的阅读和耐心!祝愿你在编程的道路上取得更多的成功与喜悦!"🎆✨🎄

⭐️点赞收藏加关注,学习知识不迷路⭐️

🎉✔️💪🎉✔️💪🎉✔️💪🎉✔️💪🎉

👍😏⛳️点赞☀️收藏⭐️关注😏👍

👍😏⛳️点赞☀️收藏⭐️关注😏👍

👍😏⛳️点赞☀️收藏⭐️关注😏👍

🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️

相关文章:

Java网络编程(下)

White graces&#xff1a;个人主页 &#x1f649;专栏推荐:Java入门知识&#x1f649; &#x1f649; 内容推荐:Java网络编程&#x1f649; &#x1f439;今日诗词:姑苏城外寒山寺&#xff0c;夜半钟声到客船&#x1f439; ⛳️点赞 ☀️收藏⭐️关注&#x1f4ac;卑微小博主…...

APISIX的安装与测试(springboot服务测试)

安装&#xff1a; 1.1安装依赖&#xff1a; curl https://raw.githubusercontent.com/apache/apisix/master/utils/install-dependencies.sh -sL | bash -1.2 安装 OpenResty yum-config-manager --add-repo https://openresty.org/package/centos/openresty.reposudo yum i…...

AI技术:探索未来智能的无限可能

随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;技术已经成为我们这个时代最引人瞩目的科技力量。从简单的自动化任务到复杂的决策支持系统&#xff0c;AI技术正在以前所未有的速度改变着我们的世界。本文将深入探讨AI技术的定义、发展历程、当前应用、面临…...

npm install 出错,按照版本不匹配解决

一、现象 npm install npm WARN config global --global, --local are deprecated. Use --locationglobal instead. npm ERR! code ERESOLVE npm ERR! ERESOLVE unable to resolve dependency tree npm ERR! npm ERR! While resolving: panshi-main-web0.1.0 npm ERR! Found…...

【第1章】SpringBoot实战篇之注册接口

文章目录 前言一、代码部分1. User2.UserMapper13. UserSerivce4. UserController15. Result 二、测试1.注册2.再次注册 总结 前言 下面介绍用户注册接口。 一、代码部分 1. User package org.example.springboot3.bigevent.entity;import com.baomidou.mybatisplus.annotat…...

代码随想录-Day25

216.组合总和III 找出所有相加之和为 n 的 k 个数的组合&#xff0c;且满足下列条件&#xff1a; 只使用数字1到9 每个数字 最多使用一次 返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次&#xff0c;组合可以以任何顺序返回。 示例 1: 输入: k 3, n 7 输…...

JavaWeb_SpringBootWeb基础

先通过一个小练习简单了解以下SpringBootWeb。 小练习&#xff1a; 需求&#xff1a;使用SpringBoot开发一个Web应用&#xff0c;浏览器发起请求/hello后&#xff0c;给浏览器返回字符串"Hello World~"。 步骤&#xff1a; 1.创建SpringBoot项目&#xff0c;勾选We…...

Stable Diffusion生成图片的参数查看与抹除方法

前几天分享了几张Stable Diffusion生成的艺术二维码&#xff0c;有同学反映不知道怎么查看图片的参数信息&#xff0c;还有的同学问怎么保护自己的图片生成参数不会泄露&#xff0c;这篇文章就来专门分享如何查看和抹除图片的参数。 查看图片的生成参数 1、打开Stable Diffus…...

Linux下多线程的相关概念

&#x1f916;个人主页&#xff1a;晚风相伴-CSDN博客 &#x1f496;如果觉得内容对你有帮助的话&#xff0c;还请给博主一键三连&#xff08;点赞&#x1f49c;、收藏&#x1f9e1;、关注&#x1f49a;&#xff09;吧 &#x1f64f;如果内容有误或者有写的不好的地方的话&…...

在java java.util.Date 已知逝去时间怎么求年月日

在java中&#xff0c;可以使用java.util.Date类来获取年、月和日。以下是一种方法&#xff1a; 首先创建一个java.util.Date对象&#xff0c;表示逝去的时间。 Date pastDate new Date(逝去的时间的毫秒数);然后使用java.util.Calendar类来获取年、月和日。 Calendar calen…...

LeetCode 2928.给小朋友们分糖果 I:Java提交的运行时间超过了61%的用户

【LetMeFly】2928.给小朋友们分糖果 I&#xff1a;Java提交的运行时间超过了61%的用户 力扣题目链接&#xff1a;https://leetcode.cn/problems/distribute-candies-among-children-i/ 给你两个正整数 n 和 limit 。 请你将 n 颗糖果分给 3 位小朋友&#xff0c;确保没有任何…...

【typescript/flatbuffer】在websocket中使用flatbuffer

目录 说在前面场景fbs服务器代码前端typescript代码问题 说在前面 操作系统&#xff1a;Windows11node版本&#xff1a;v18.19.0typescript flatbuffer版本&#xff1a;24.3.25 场景 服务器(本文为golanggin)与前端通信时使用flatbuffer进行序列化与反序列化通信协议为websock…...

构建一个文字冒险游戏:Python 编程实战

在本文中&#xff0c;我们将探索如何使用 Python 创建一个简单的文字冒险游戏。通过这个项目&#xff0c;你将了解到基础的编程技术&#xff0c;包括条件语句、函数和基本的用户输入处理&#xff0c;同时也能体会到文本游戏的魅力和设计的挑战。 项目概述 文字冒险游戏是一种…...

09Linux GDB学习笔记

Linux GDB使用 目录 文章目录 Linux GDB使用先编译文件1.检查安装1.1 安装GDB 2.启动GDB3.退出GDB4.设置断点4.1 在指定行号处设置断点4.2 在指定函数名处设置断点4.3 在指定源文件和行号处设置断点 4.4查看断点信息4.5删除断点5.运行5.1 <font color#ff0000>逐过程&am…...

海外金融牌照

一般来说牌照申请分两个大类&#xff1a;数字货币牌照和外汇牌照。每个国家的牌照具体监管的情况也是不一样的。申请牌照时该如何选择&#xff1f; 今天先说说区块链牌照&#xff0c;具有代表性的有美国msb牌照&#xff0c;加拿大msb牌照&#xff0c;爱沙尼亚数字货币牌照&…...

addEventListener()方法中的几个参数,以及作用

addEventListener() 方法是 JavaScript 中用于处理指定元素的指定事件的函数。它有三个参数&#xff1a; type&#xff08;必需&#xff09;&#xff1a;一个字符串&#xff0c;指定要监听的事件名。 listener&#xff08;必需&#xff09;&#xff1a;一个实现了 EventListen…...

FreeRtos进阶——通用链表的实现方式

通用链表实现方式&#xff08;一&#xff09; struct node_t {struct node_t *next; };struct person {struct node_t node;char *name;int age; };struct dog {struct node_t node;char *name;int age;char *class; };在此链表中&#xff0c;node结构体被放在了最前面&#x…...

【kubernetes】关于k8s集群如何将pod调度到指定node节点(亲和与反亲和等)

目录 一、调度约束 1.1K8S的 List-Watch 机制 ⭐⭐⭐⭐⭐ 1.1.1Pod 启动典型创建过程 二、调度过程 2.1Predicate&#xff08;预选策略&#xff09; 常见的算法 2.2priorities&#xff08;优选策略&#xff09;常见的算法 三、k8s将pod调度到指定node的方法 3.1指定…...

AOP基础

黑马程序员JavaWeb开发教程 文章目录 一、AOP概述二、AOP快速入门2.1 步骤2.2 AOP的使用场景2.3 AOP的优势 三、AOP核心概念3.1 AOP核心概念3.2 AOP执行流程 一、AOP概述 AOP&#xff1a;Aspect Oriented Propragramming(面向切面变成、面向方面编程)其实就是面向特定方法编程…...

EXSI虚拟机新增磁盘并将空间扩充到已有分区

这里写自定义目录标题 1、在EXSI虚拟机中新增一块磁盘配置大小2、确认新磁盘3、格式化新分区4、添加新分区到LVM5、将新增分区添加到已有分区里 1、在EXSI虚拟机中新增一块磁盘配置大小 注意事项&#xff1a; (1)需确保虚拟机已关闭活处于维护模式&#xff0c;避免数据丢失 (2…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

三维GIS开发cesium智慧地铁教程(5)Cesium相机控制

一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点&#xff1a; 路径验证&#xff1a;确保相对路径.…...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面&#xff0c;开源代码 作为一个电子罗盘模块&#xff0c;我们可以通过I2C从中获取偏航角yaw&#xff0c;相对于六轴陀螺仪的yaw&#xff0c;qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

【解密LSTM、GRU如何解决传统RNN梯度消失问题】

解密LSTM与GRU&#xff1a;如何让RNN变得更聪明&#xff1f; 在深度学习的世界里&#xff0c;循环神经网络&#xff08;RNN&#xff09;以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而&#xff0c;传统RNN存在的一个严重问题——梯度消失&#…...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求&#xff0c;由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面&#xff1a; &#x1f3db;️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限&#xff0c;形成层级清晰的管理网络&#xf…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

反射获取方法和属性

Java反射获取方法 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;允许程序在运行时访问和操作类的内部属性和方法。通过反射&#xff0c;可以动态地创建对象、调用方法、改变属性值&#xff0c;这在很多Java框架中如Spring和Hiberna…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合

在汽车智能化的汹涌浪潮中&#xff0c;车辆不再仅仅是传统的交通工具&#xff0c;而是逐步演变为高度智能的移动终端。这一转变的核心支撑&#xff0c;来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒&#xff08;T-Box&#xff09;方案&#xff1a;NXP S32K146 与…...