基于java的网络编程入门
1. 什么是IP地址
由此可见,32位最大为255.255.255.255
打开cmd查询自己电脑的ip地址:ipconfig
测试网络是否通畅:ping 目标ip地址
2. IP地址的组成
注意:127.0.0.1是回送地址,指本地机,一般用来测试使用
我们生活中一般使用的是C类IP地址,如:你的ip是192.168.75.5,这是你的内网ip,非内网的用户无法通过此ip连接到你的电脑。如果此时你连接的是wifi路由器,那么就可以轻松验证网络地址,192.168.75就是网络地址,可以在路由器机盒的底部信息找到,.5就是主机地址,那么也就是说,该路由器最大容量为255,即最大为192.168.75.255,除去网关等地址实际可承载最大连接设备数可能在250左右。
如图所示,假设有两个路由器,一个是192.168.75.1,一个是192.168.76.1
192.168.75.15和192.168.75.160连接着第一个路由器
192.168.76.12和192.168.76.135连接着第二个路由器
在没有连接互联网的情况下,192.168.75.15去ping 192.168.75.160是可以接受和发送数据包的,同理76,但是用75的主机去ping76的主机是无法传输的,因为他们之间没有连接。在没有外网的连接下,左边和右边的三台设备各自组成了局域网。
用百度来举例,180.101.51.73就是公网(对全球放行),www.baidu.com这个则是域名。那么什么是域名呢?
3. DNS域名解析
DNS(Domain Name System)即域名系统,是互联网的一项核心服务。域名是便于人们记忆和使用的网站地址,如www.baidu.com,而计算机在网络中通信需要使用 IP 地址,如 14.215.177.38。DNS 域名解析就是把域名转换为计算机能够识别的 IP 地址的过程。
作用和意义
- 方便记忆和使用:域名具有一定的语义和逻辑性,相比复杂的 IP 地址,更容易被用户记住和输入。
- 便于管理和维护:通过 DNS 系统,网站管理员可以方便地更改网站服务器的 IP 地址,而无需用户修改访问地址。只需要在 DNS 服务器上进行相应的配置更改,用户就可以通过域名继续访问网站,而不会受到 IP 地址变化的影响。
- 实现负载均衡:DNS 可以将同一个域名解析到多个不同的 IP 地址上,通过这种方式,可以将用户的访问请求分配到不同的服务器上,实现负载均衡,提高系统的性能和可靠性。
4. 网络服务器
邮件服务器基本不用,我们更专注于对Web服务器的使用:
- 定义:Web 服务器是一种专门用于处理和传输 Web 页面的网络服务器。它主要负责接收客户端(如浏览器)发送的 HTTP 请求,根据请求内容返回相应的 HTML 页面、图片、脚本等资源,以实现 Web 应用程序的访问和交互。
- 功能:Web 服务器的核心功能是处理 HTTP 协议,解析客户端发送的请求,并根据请求的 URL 和其他参数来定位和获取相应的资源。然后,将这些资源按照 HTTP 协议的规定进行封装和传输,返回给客户端浏览器。此外,Web 服务器还可以支持 SSL/TLS 加密,以确保数据在传输过程中的安全性;同时,它还能够进行访问控制、日志记录等管理功能,方便对网站的访问进行监控和管理。
- 常见的 Web 服务器软件
- Apache:是一款开源的、广泛使用的 Web 服务器软件。它具有高度的稳定性和可扩展性,支持多种操作系统,能够处理大量的并发请求。Apache 还拥有丰富的模块和插件,可通过各种配置文件进行灵活的定制和扩展,适用于各种规模的网站和应用程序。
我们后续会对Web服务器做更多讲解,现在只需暂时了解即可。
5. 网络通信协议(TCP/UDP)⭐(重点)
TCP⭐
- 特点
- 面向连接:在数据传输之前,需要先在发送方和接收方之间建立连接,就像打电话一样,先拨号建立连接,然后才能通话。连接建立过程通过 “三次握手” 来完成,确保双方都做好了数据传输的准备。
- 可靠传输:TCP 通过序列号、确认应答、重传机制等保证数据的可靠传输。发送方会为每个发送的数据段分配一个序列号,接收方收到数据后会发送确认应答给发送方。如果发送方在一定时间内没有收到确认应答,就会认为数据传输失败,并重传该数据段。
- 字节流传输:TCP 将数据看作是无结构的字节流,它不关心数据的具体内容和格式,只负责将字节流从发送方准确地传输到接收方。
- 流量控制与拥塞控制:TCP 具有流量控制机制,通过接收方告知发送方自己的接收窗口大小,来控制发送方的发送速度,防止发送方发送数据过快导致接收方缓冲区溢出。同时,TCP 还具备拥塞控制机制,当网络出现拥塞时,自动调整发送方的发送速率,以避免网络拥塞进一步恶化。
- 应用场景:适用于对数据准确性和完整性要求较高的场景,如文件传输、电子邮件、网页浏览、远程登录等。例如,在下载文件时,需要确保文件的每个字节都准确无误地传输到本地,TCP 的可靠传输特性就能很好地满足这一需求。
字节流对应的就是File I/O里的InputStream和OutputStream! 也就是Buffer!
UDP
- 特点
- 无连接:UDP 在数据传输时不需要先建立连接,就像写信一样,直接将信件(数据)发送出去,不需要事先与接收方打招呼。这种方式使得 UDP 的传输效率较高,延迟较小。
- 不可靠传输:UDP 不保证数据一定能被正确接收,也不提供确认应答、重传等机制。数据发送出去后,UDP 不会关心数据是否到达接收方,以及接收方是否正确接收。因此,UDP 可能会出现数据丢失、重复或乱序的情况。
- 数据报传输:UDP 将数据封装成一个个独立的数据报进行传输,每个数据报都包含源端口、目的端口、数据等信息。数据报之间相互独立,没有顺序关系。
- 无流量控制和拥塞控制:UDP 没有内置的流量控制和拥塞控制机制,发送方可以按照自己的速率发送数据,不会根据网络状况和接收方的情况进行调整。
- 应用场景:适用于对实时性要求较高、对数据准确性要求相对较低的场景,如实时视频会议、音频流传输、在线游戏等。例如,在视频会议中,偶尔丢失一些数据帧可能只会导致画面出现轻微的卡顿,但不会影响整体的会议效果,而 UDP 的低延迟特性能够保证视频和音频的实时传输,让用户获得较好的体验。
6. Socket简介(重点) ⭐
java.net 包
Socket和ServerSocket面向TCP协议,DatagramPacket和DatagramSocket面向UDP协议,InetAddress则是面向ip地址。
我们现在重点面向TCP开发。
7. 基于TCP协议的Socket编程(重点) ⭐
下面是例子详细流程:
首先我们创建两个project,一个充当Server一个充当Client
在Server中:
()内要填写的是一个端口,什么是端口呢?假设此时我们的电脑通过ip地址连接了,那么我用微信给你发送的信息你需要用微信来接收,不能歪到QQ去接收,那么此时监听微信的端口就可以锁定你的微信,从而不让信息流向错误位置的地方。端口最大为1-65535。建议使用1024以上的端口,因为1024以下的端口有可能被系统占用。
那么我们使用8888来继续操作:
现在我们创建了服务器,那么就要等待别人来连接我们,比如微信输入了账号密码以后点击登录,此时账号和密码会发送给服务器,服务器验证了账号密码看是否存在,返回一个值。我们调用一个堵塞方法来等待别人连接服务器。
输出结果:
我们发现 “有人连接了” 并没有被打印,因为并没有人来连接,所以被accept方法堵住了。
在Client中:
首先使用Socket类创建对象,然后输入目标ip地址和Sever中预设的端口。这样,我们基础的连接就完成了。
运行一下代码,回到Server中查看输出
输出结果:
接下来我们尝试发送信息!
Client:
Server:
输出结果:
接下来服务器给客户端返回一条信息,此时客户端就要关闭输出的嘴巴,打开收听的耳朵:
Client:
Server:
输出结果:
注意:使用完对应的方法后要记得在结尾关闭!
8. Socket中实现对象的传递
Java 序列化是指把 Java 对象转换为字节序列的过程,而反序列化则是把字节序列恢复为 Java 对象的过程。序列化主要用于对象的存储和网络传输。
注意:发送和接收的对象需要在同一个包名里!这是规范!
下面是例子详细流程:
在myTcpServer中创建一个com.zb.entity包,创建一个Student类:
同理,在myTcpClient创建一个com.zb.entity包,创建一个Student类。
在Server中建立一个ObjectServer:
在Client中初始化信息:
然后尝试运行,打开服务器,在Client中运行程序,会发现报错:
为什么会报错呢?因为Student这个类没有被序列化(Serializable),所以我们需要给Student类添加一个接口使其可序列化:
现在运行就不会报错了。
同样的,Server在接收该对象后也需要将其序列化,这样也可以读取信息了。
接下来进行发送接收验证操作:
Client:
Server:
我们会发现在我们写到readObject()的时候系统提示我们抛出一个ClassNotFoundException(对象没有被找到)异常,这也证明了ObjectInputStream接收的正是对象。
运行代码,输出结果:
我们发现,在我们运行代码时,每运行一次服务器都要开启一次,在现实中服务器通常365天都在运行,那么我们该如何让服务器不停的运作呢?
用while死循环可以启到这样的作用
这样Client每运行一次,客户端都会打印一次输出。
加强练习:收到学生信息后返回给客户端一条信息,代码在另一篇代码展示中。
9. 多线程处理多请求
在上面的对象传递代码中,我们给服务器休眠5秒
如果我同时有张三和李四两个人对服务器发出请求,我们会发现两个人在同一时间点发出的请求,服务器却是一个一个的处理请求:
也就是说我们服务器现在正在做单线程处理,如果张三出现了问题,那么李四就因为张三的故障从而一直等待,进不去系统,那我们该如何解决呢?
下面是例子详细流程:
首先我们在MyTcpServer中创建一个ServerSocketThread类,继承Thread父类,创建一个连接对象
然后将之前模拟的代码剪切到run方法中
接着CTRL+ALT+T选中的区域快速生成try-catch块
编写一个finally,将下面关闭流close()放进去,选中也try-catch一下
回到主线程中
这样,我们就把处理网络通信的数据处理交给了一个独立的线程来做,这个线程内实现的就是我们读和写的功能,运行两个客户端得到结果
输出结果
张三:
李四:
Server:
附录:
基于java的网络编程入门的课堂演示代码-CSDN博客
课后练习:
TCP基础题:音乐播放列表管理系统-CSDN博客
TCP基础题:电影收藏管理系统-CSDN博客
相关文章:

基于java的网络编程入门
1. 什么是IP地址 由此可见,32位最大为255.255.255.255 打开cmd查询自己电脑的ip地址:ipconfig 测试网络是否通畅:ping 目标ip地址 2. IP地址的组成 注意:127.0.0.1是回送地址,指本地机,一般用来测试使用 …...
CV和NLP领域常见模型列表
图像分类(Image Classification) 模型名特点备注ConvNeXt V2卷积改进,媲美 Transformer强于 ResNet、EfficientNetVision Transformer (ViT)全 Transformer 架构开创图像 transformer 浪潮Swin Transformer V2局部注意力 金字塔结构更强的多…...

Git简介与入门
Git的发明 Git由著名的Linux创始人linus于2005年发明(所以git的界面、使用方式与Linux挺像的,即命令行方式) 经过发展,现在广泛应用于代码管理与团队协作。 Git特性 Git是分布式版本控制系统 分布式 每个开发者拥有完整仓库&…...

Linux 网络基础三 (数据链路层协议:以太网协议、ARP 协议)
一、以太网 两个不同局域网的主机传递数据并不是直接传递的,而是通过路由器 “一跳一跳” 的传递过去。 跨网络传输的本质:由无数个局域网(子网)转发的结果。 所以,要理解数据跨网络转发原理就要先理解一个局域网中数…...

16.QT-Qt窗口-菜单栏|创建菜单栏|添加菜单|创建菜单项|添加分割线|添加快捷键|子菜单|图标|内存泄漏(C++)
Qt窗⼝是通过QMainWindow类来实现的。 QMainWindow是⼀个为⽤⼾提供主窗⼝程序的类,继承⾃QWidget类,并且提供了⼀个预定义的布局。QMainWindow包含⼀个菜单栏(menu bar)、多个⼯具栏(tool bars)、多个浮动窗⼝(铆接部…...

[特殊字符] 分布式定时任务调度实战:XXL-JOB工作原理与路由策略详解
在微服务架构中,定时任务往往面临多实例重复执行、任务冲突等挑战。为了解决这一问题,企业级调度框架 XXL-JOB 提供了强大的任务统一调度与执行机制,特别适合在分布式系统中使用。 本文将从 XXL-JOB 的核心架构入手,详细讲解其调…...

java面试题及答案2020,java最新面试题(四十四)
java面试题及答案2020 二面-2020/3/18 1、自我介绍项目比赛 2、java集合框架全部介绍。。从list set queue到map 3、hashmap底层扩容线程安全问题 4、如果-一个对象要作为hashmap的key需要做什么 5、Threadlocal类以及 内存泄漏 6、线程同步方式,具体每一个怎么做的 7、jvm类加…...
Spring Boot 中处理 JSON 数值溢出问题:从报错到优雅解决
一、问题背景:为什么我的接口突然报错了? 假设你正在开发一个 Spring Boot 接口,接收类似这样的 JSON 请求: {"size": 111111111111111111111 }然后突然收到用户的反馈:请求报错啦! 查看日志&a…...

oracle 锁的添加方式和死锁的解决
DML锁添加方式 DML 锁可由一个用户进程以显式的方式加锁,也可通过某些 SQL 语句隐含方式实现。 DML 锁有三种加锁方式:共享锁方式、独占锁方式、共享更新。 共享锁,独占锁用于 TM 锁,共享锁用于 TX 锁。 1)共享方式的表级锁 共享方…...

基于Hadoop的音乐推荐系统(源码+lw+部署文档+讲解),源码可白嫖!
摘要 本毕业生数据分析与可视化系统采用B/S架构,数据库是MySQL,网站的搭建与开发采用了先进的Java语言、爬虫技术进行编写,使用了Spring Boot框架。该系统从两个对象:由管理员和用户来对系统进行设计构建。主要功能包括ÿ…...

Java查询数据库表信息导出Word
参考: POI生成Word多级标题格式_poi设置word标题-CSDN博客 1.概述 使用jdbc查询数据库把表信息导出为word文档, 导出为word时需要下载word模板文件。 已实现数据库: KingbaseES, 实现代码: 点击跳转 2.效果图 2.1.生成word内容 所有数据库合并 数据库不合并 2.2.生成文件…...
DAY9:Oracle数据库安全管理深度解析
引言 在当今数据泄露事件频发的时代,数据库安全管理已成为DBA和开发者的必修课。本文将深入探讨Oracle数据库安全管理的四大核心领域:用户权限管理、数据库审计、透明数据加密(TDE)和虚拟私有数据库(VPD)&…...

RK3588平台用v4l工具调试USB摄像头实践(亮度,饱和度,对比度,色相等)
目录 前言:v4l-utils简介 一:查找当前的摄像头设备 二:查看当前摄像头支持的v4l2-ctl调试参数 三根据提示设置对应参数,在提示范围内设置 四:常用调试命令 五:应用内执行命令方法 前言:v4l-utils简介 v4l-utils工具是由Linu…...
Dart Flutter数据类型详解 int double String bool list Map
目录 字符串的几种方式 bool值的判断 List的定义方式 Map的定义方式 Dart判断数据类型 (is 关键词来判断类型) Dart的数据类型详解 int double String bool list Map 常用数据类型: Numbers(数值): int double Strings(字符串) String Booleans(布尔…...
LainChain技术解析:基于RAG架构的下一代语言模型增强框架
摘要 随着大语言模型(LLM)在自然语言处理领域的突破性进展,如何突破其知识时效性限制、提升事实准确性成为关键挑战。LainChain通过整合检索增强生成(RAG)技术,构建起动态知识接入框架,为LLM提供实时外部知识支持。本文从技术原理、架构设计、应用场景三个维度,深入解…...
组件是怎样写的(1):虚拟列表-VirtualList
本篇文章是《组件是怎样写的》系列文章的第一篇,该系列文章主要说一下各组件实现的具体逻辑,组件种类取自 element-plus 和 antd 组件库。 每个组件都会有 vue 和 react 两种实现方式,可以点击 https://hhk-png.github.io/components-show/ …...

在Linux中,使用read函数去读取写入文件空洞部分时,读取出来的内容是什么?为什么这样操作,以及应用场景?
使用 read 函数读取文件空洞(hole)部分时,读取到的内容会被系统填充为 \0(即零字节)。文件空洞是稀疏文件中未实际分配磁盘空间的区域,但逻辑上表现为连续的零字节。 1.在指定空洞部分后,写入数…...

Qt6笔记-对Qt6中对CMakeLists.txt的解析
首先,新建Qt Console Application项目。 下面对CMakeLists.txt进行次理解。新建好后,Qt Creator会生成CMakeLists.txt,具体内容如下: cmake_minimum_required(VERSION 3.16)project(EasyCppMain LANGUAGES CXX)set(CMAKE_AUTOUIC…...

CIFAR10图像分类学习笔记(三)---数据加载load_cifar10
新创建一个load_cifar10源文件 需要导入的包 import glob from torchvision import transforms from torch.utils.data import DataLoader ,Dataset import os #读取工具 from PIL import Image import numpy as np 01同样定义10个类别的标签名数组 label_name ["airpl…...

计算机视觉cv入门之答题卡自动批阅
前边我们已经讲解了使用cv2进行图像预处理与边缘检测等方面的知识,这里我们以答题卡自动批阅这一案例来实操一下。 大致思路 答题卡自动批阅的大致流程可以分为这五步:图像预处理-寻找考试信息区域与涂卡区域-考生信息区域OCR识别-涂卡区域填涂答案判断…...

Java学习手册:JSON 数据格式基础知识
1. JSON 简介 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于阅读和编写,也易于机器解析和生成。它最初来源于 JavaScript,但如今已被许多语言所采用,包括 Java、Python、C 等。JSON 以…...
【Python爬虫详解】第四篇:使用解析库提取网页数据——BeautifuSoup
在前一篇文章中,我们学习了如何编写第一个爬虫程序,成功获取了网页的HTML内容。然而,原始HTML通常包含大量我们不需要的信息,真正有价值的数据往往隐藏在HTML的标签和属性中。这一篇,我们将学习如何使用Python的解析库…...

《重塑AI应用架构》系列: Serverless与MCP融合创新,构建AI应用全新智能中枢
在人工智能飞速发展的今天,数据孤岛和工具碎片化问题一直是阻碍AI应用高效发展的两大难题。由于缺乏统一的标准,AI应用难以无缝地获取和充分利用数据价值。 为了解决这些问题,2024年AI领域提出了MCP(Model Context Protocol模型上…...

深度图可视化
import cv2# 1.读取一张深度图 depth_img cv2.imread("Dataset_depth/images/train/1112_0-rgb.png", cv2.IMREAD_UNCHANGED) print(depth_img.shape) cv2.imshow("depth", depth_img) # (960, 1280) print(depth_img)# 读取一张rgb的图片做对比 input_p…...
【调优】log日志海量数据分表后查询速度调优
原始实现 使用pagehelper实现分页 // 提取开始时间的年份和月份,拼装成表名List<String> timeBetween getTimeBetween(condition);List<String> fullTableName getFullTableName(Constants.LOG_TABLE_NAME, timeBetween);PageHelperUtil.startPage(c…...
hive默认的建表格式
在 Hive 中创建表时,默认的建表语法格式如下: CREATE TABLE table_name (column1_type,column2_type,... ) ROW FORMAT DELIMITED FIELDS TERMINATED BY , STORED AS TEXTFILE;在这个语法中: CREATE TABLE table_name:指定要创建…...
sass 变量
基本使用 如果分配给变量的值后面添加了 !default 标志 ,这意味着该变量如果已经赋值,那么它不会被重新赋值,但是,如果它尚未赋值,那么它会被赋予新的给定值。 如果在此之前变量已经赋值,那就不使用默认值…...

微软Edge浏览器字体设置
前言 时间:2025年4月 自2025年4月起,微软Edge浏览器的默认字体被微软从微软雅黑替换成了Noto Sans,如下图。Noto Sans字体与微软雅黑风格差不多,但在4K以下分辨率的显示器上较微软雅黑更模糊,因此低分辨率的显示器建议…...

Vue生命周期详细解析
前言 Vue.js作为当前最流行的前端框架之一,其生命周期钩子函数是每个Vue开发者必须掌握的核心概念。本文将全面解析Vue的生命周期,帮助开发者更好地理解Vue实例的创建、更新和销毁过程。 一、Vue生命周期概述 Vue实例从创建到销毁的整个过程被称为Vue…...

基于c#,wpf,ef框架,sql server数据库,音乐播放器
详细视频: 【基于c#,wpf,ef框架,sql server数据库,音乐播放器。-哔哩哔哩】 https://b23.tv/ZqmOKJ5...