Java高级重点知识点-23-网络编程

文章目录

  • 网络编程入门
    • 软件结构
    • 网络通信协议
    • 协议分类
    • 网络编程三要素
  • TCP通信程序
    • 通信步骤
    • Socket类
    • ServerSocket类
    • 简单的TCP网络程序
  • 文件上传【拓展】

网络编程入门

软件结构

  • C/S结构 :全称为Client/Server结构,是指客户端和服务器结构。
  • B/S结构 :全称为Browser/Server结构,是指浏览器和服务器结构。

网络通信协议

网络通信协议:通信协议是对计算机必须遵守的规则,只有遵守这些规则,计算机之间才能进行通信。

  • TCP/IP协议: 传输控制协议/因特网互联协议( Transmission Control Protocol/Internet Protocol),是
    Internet最基本、最广泛的协议。
    在这里插入图片描述

协议分类

java.net 包中提供了两种常见的网络协议的支持

  1. TCP:传输控制协议 (Transmission Control Protocol)。TCP协议是面向连接的通信协议,即传输数据之前,在发送端和接收端建立逻辑连接,然后再传输数据,它提供了两台计算机之间可靠无差错的数据传输。
  2. UDP:用户数据报协议(User Datagram Protocol)。UDP协议是一个面向无连接的协议。传输数据时,不需要建立连接,不管对方端服务是否启动,直接将数据、数据源和目的地都封装在数据包中,直接发送。每个数据包的大小限制在64k以内。它是不可靠协议,因为无连接,所以传输速度快,但是容易丢失数据。

TCP中的三次握手: TCP协议中,在发送数据的准备阶段,客户端与服务器之间的三次交互,以保证连接的可靠。

  • 第一次握手,客户端向服务器端发出连接请求,等待服务器确认。
  • 第二次握手,服务器端向客户端回送一个响应,通知客户端收到了连接请求。
  • 第三次握手,客户端再次向服务器端发送确认信息,确认连接。

网络编程三要素

  1. 协议:计算机网络通信必须遵守的规则
  2. IP地址:指互联网协议地址(Internet Protocol Address),俗称IP。IP地址用来给一个网络中的计算机设备做唯一的编号。
  • IPv4:是一个32位的二进制数,通常被分为4个字节,表示成 a.b.c.d 的形式,例如 192.168.65.100 。其中a、b、c、d都是0~255之间的十进制整数,那么最多可以表示42亿个。
  • 采用128位地址长度,每16个字节一组,分成8组十六进制数,表示成 ABCD:EF01:2345:6789:ABCD:EF01:2345:6789,解决了网络地址资源数量不够的问题。
    常用命令:
  • ipconfig【查看本机IP地址】
    在这里插入图片描述
  • ping 空格 IP地址 【检查网络是否连通】
  1. 端口号
  • 用两个字节表示的整数,它的取值范围是0 ~ 65535。其中,0~1023之间的端口号用于一些知名的网
    络服务和应用,普通的应用程序需要使用1024以上的端口号。如果端口号被另外一个服务或应用所占用,会导致当前程序启动失败。
    标识网络中的进程: 协议 + IP地址 + 端口号

TCP通信程序

TCP通信能实现两台计算机之间的数据交互,通信的两端,要严格区分为客户端(Client)与服务端(Server)。

通信步骤

  • 服务端程序,需要事先启动,等待客户端的连接。
  • 客户端主动连接服务器端,连接成功才能通信。服务端不可以主动连接客户端。

在Java中,提供了两个类用于实现TCP通信程序:

  1. 客户端: java.net.Socket 类表示。创建 Socket 对象,向服务端发出连接请求,服务端响应请求,两者建立连接开始通信。
  2. 服务端: java.net.ServerSocket 类表示。创建 ServerSocket 对象,相当于开启一个服务,并等待客户端的连接。

Socket类

Socket 类:该类实现客户端套接字,套接字指的是两台设备之间通讯的端点。
构造方法:
public Socket(String host, int port) :创建套接字对象并将其连接到指定主机上的指定端口号。如果指定的host是null ,则相当于指定地址为回送地址( 回送地址(127.x.x.x) 是本机回送地址(Loopback Address))。
成员方法:

  • public InputStream getInputStream() : 返回此套接字的输入流。
  • public OutputStream getOutputStream() : 返回此套接字的输出流。
  • public void close() :关闭此套接字。
  • public void shutdownOutput() : 禁用此套接字的输出流。

ServerSocket类

ServerSocket 类:这个类实现了服务器套接字,该对象等待通过网络的请求。
构造方法:
public ServerSocket(int port) :使用该构造方法在创建ServerSocket对象时,就可以将其绑定到一个指
定的端口号上,参数port就是端口号。
成员方法:
public Socket accept() :侦听并接受连接,返回一个新的Socket对象,用于和客户端实现通信。该方法
会一直阻塞直到建立连接。

简单的TCP网络程序

TCP通信分析:

  1. 【服务端】启动,创建ServerSocket对象,等待连接。
  2. 【客户端】启动,创建Socket对象,请求连接。
  3. 【服务端】接收连接,调用accept方法,并返回一个Socket对象。
  4. 【客户端】Socket对象,获取OutputStream,向服务端写出数据。
  5. 【服务端】Socket对象,获取InputStream,读取客户端发送的数据。
  6. 【服务端】Socket对象,获取OutputStream,向客户端回写数据。
  7. 【客户端】Scoket对象,获取InputStream,解析回写数据。
  8. 【客户端】释放资源,断开连接。

代码示例:

  • 服务器端:
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;public class ServerTCP {public static void main(String[] args) throws IOException {System.out.println("服务端启动 , 等待连接 .... ");// 1.创建 ServerSocket对象,绑定端口,开始等待连接ServerSocket ss = new ServerSocket(6666);// 2.接收连接 accept 方法, 返回 socket 对象.Socket server = ss.accept();// 3.通过socket 获取输入流InputStream is = server.getInputStream();// 4.一次性读取数据// 4.1 创建字节数组byte[] b = new byte[1024];// 4.2 据读取到字节数组中.int len = is.read(b);// 4.3 解析数组,打印字符串信息String msg = new String(b, 0, len);System.out.println(msg);//5.关闭资源.is.close();server.close();}
}

服务器端指定了端口号,通过accept()方法获取Socket对象,通过客户端对象获取输入流,最后读取数据,等待客户端发送的消息。

  • 客户端
import java.net.Socket;public class ClientTCP {public static void main(String[] args) throws Exception {System.out.println("客户端 发送数据");// 1.创建 Socket ( ip , port ) , 确定连接到哪里.Socket client = new Socket("localhost", 6666);// 2.获取流对象 . 输出流OutputStream os = client.getOutputStream();// 3.写出数据.os.write("你好么? tcp ,我来了".getBytes());// 4. 关闭资源 .os.close();client.close();}
}

客户端创建时指定连接的IP地址以及端口号,以便于连接服务器,通过客户端Socket对象来获取输出流,输出数据。
在这里插入图片描述

文件上传【拓展】

  1. 【客户端】输入流,从硬盘读取文件数据到程序中。
  2. 【客户端】输出流,写出文件数据到服务端。
  3. 【服务端】输入流,读取文件数据到服务端程序。
  4. 【服务端】输出流,写出文件数据到服务器硬盘中。
  5. 【服务端】获取输出流,回写数据。
  6. 【客户端】获取输入流,解析回写数据。

数据准备:在D盘下面放一个文件名为test.jpg的文件,创建一个test文件夹

代码示例:

  • 服务端
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;public class FileUpload_Server {public static void main(String[] args) throws IOException {System.out.println("服务器 启动..... ");// 1. 创建服务端ServerSocketServerSocket serverSocket = new ServerSocket(6666);// 2. 循环接收,建立连接while (true) {Socket accept = serverSocket.accept();/* 3. socket对象交给子线程处理,进行读写操作Runnable接口中,只有一个run方法,使用lambda表达式简化格式 */new Thread(() -> {try (   //3.1 获取输入流对象BufferedInputStream bis = new BufferedInputStream(accept.getInputStream());//3.2 创建输出流对象, 保存到本地 .FileOutputStream fis = new FileOutputStream("D:/test/" + System.currentTimeMillis() + ".jpg");BufferedOutputStream bos = new BufferedOutputStream(fis)) {// 3.3 读写数据byte[] b = new byte[1024 * 8];int len;while ((len = bis.read(b)) != -1) {bos.write(b, 0, len);}// 4.=======信息回写===========================System.out.println("back ........");OutputStream out = accept.getOutputStream();out.write("上传成功".getBytes());out.close();//5. 关闭 资源bos.close();bis.close();accept.close();System.out.println("文件上传已保存");} catch (IOException e) {e.printStackTrace();}}).start();}}
}

这里首先创建了一个服务器对象,通过while(true)来保证服务器的持续连接,然后通过开启一个线程来保证当一个用户上传大文件的时候,其他用户上传文件的效率不会受到影响。利用系统毫秒数 + ‘.jpg’设置文件名,来保证上传时不会导致文件名相同而被覆盖。

  • 客户端
import java.io.*;
import java.net.Socket;public class FileUpload_Client {public static void main(String[] args) throws IOException {// 1.创建流对象// 1.1 创建输入流,读取本地文件BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\\test.jpg"));// 1.2 创建输出流,写到服务端Socket socket = new Socket("localhost", 6666);BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());//2.写出数据.byte[] b = new byte[1024 * 8 ];int len ;while (( len = bis.read(b))!=-1) {bos.write(b, 0, len);}// 关闭输出流,通知服务端,写出数据完毕socket.shutdownOutput();System.out.println("文件发送完毕");   // 3. =====解析回写============InputStream in = socket.getInputStream();byte[] back = new byte[20];in.read(back);System.out.println(new String(back));in.close();// ============================// 4.释放资源socket.close();bis.close();}
}

在这里插入图片描述
在这里插入图片描述
这里我们可以看到我们服务器成功将用户发送的文件保存到硬盘中了。

欢迎java热爱者了解文章,作者将会持续更新中,期待各位友友的关注和收藏。。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/44950.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI Earth——2020年中国建筑物高度CNBH数据产品(10m)

数据介绍: 复旦大学生命科学学院GC3S团队(吴万本博士、赵斌教授等)利用多源地球观测数据和机器学习技术,构建了中国第一个10米分辨率的建筑高度估计模型(CNBH-10m)。基于此模型建立了中国10米分辨率的建筑高度数据集。此数据集基于全天候地球观测(雷达、光学和夜光图像)…

Iridient Developer:解锁Mac RAW图像处理的极致潜力,打造专业级色彩与细节

Iridient Developer for Mac是一款专为Mac用户设计的RAW图像调整软件,它以其卓越的性能和丰富的功能,赢得了众多摄影师的青睐。以下是对这款软件的详细介绍: 一、强大的RAW图像处理能力 Iridient Developer专为处理RAW图像而设计&#xff0…

Eel 入门:实现 Python 程序的 Web 前端界面

Eel 入门:实现 Python 程序的 Web 前端界面 Eel 是一个 Python 库,它允许 Python 程序通过简单的 API 与网页进行交互。它使用 WebSocket 协议来实现 Python 后端和 JavaScript 前端之间的实时通信。下面是关于 Eel 的用法、通信原理和使用场景的一篇博…

float、double

按照这个规定,单精度浮点数(float)这个数据类型所占内存大小为4个字节,也就是32位,所以单精度浮点数也叫32位浮点数,它在内存或硬盘中要占用32个比特。 单精度浮点数的尾数部分用23位存储,加上默…

09磁盘管理

一、磁盘管理 1.磁盘基础知识 (1)磁盘接口类型 个人电脑, 硬盘接口分为IDE类型和SATA类型 服务器版分为SCSI类型和SAS类型 (2)磁盘命名方式 windows中硬盘命名方式是c,d,e盘 linux中硬盘命名方式为 系统…

HTML+CSS+JS 实现3D风吹草动效果(B站视频)

效果&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>3D effect&…

[迫真保姆级教程]在Windows上编译可用的Tesseract OCR in C++ 并部署在Visual Studio与Qt6上

目录 前言 阅前提示 导言 使用基于vcpkg的&#xff0c;于msvc19编译器编译的Tessereact OCR动态库 使用vcpkg辅助我们的编译 正文 使用msys2环境下的&#xff0c;使用mingw64编译器编译的Tessereact OCR动态库 什么是msys2 安装前&#xff0c;我们也许。。。 [Option]…

网络钓鱼中的高级同形异义:网络安全的新威胁

网络安全正面临一个潜在的新威胁&#xff1a;在网络钓鱼攻击中使用同形异义词。 这篇调查文章探讨了同形异义现象如何在各种类型的网络钓鱼攻击中使用、其背后的技术。 对这种恶意行为的研究以及高级语言模型 (LLM) 如何帮助加速同形异形现象的研究。 什么是同形异义&#xf…

dxf数据结构

DXF&#xff08;Drawing Exchange Format&#xff0c;绘图交换格式&#xff09;是Autodesk公司开发的一种CAD&#xff08;计算机辅助设计&#xff09;文件格式&#xff0c;用于实现AutoCAD与其他软件之间的CAD数据交换。DXF格式文件是一种开放的矢量数据格式&#xff0c;具有多…

怎么办?我的C盘又爆红了!别慌!博主手把手带你管理你的C盘空间~

怎么办&#xff1f;我的C盘又爆红了&#xff01;别慌&#xff01;博主手把手带你管理你的C盘空间~ 文章目录 怎么办&#xff1f;我的C盘又爆红了&#xff01;别慌&#xff01;博主手把手带你管理你的C盘空间~0. 在开始清理之前1. 推荐执行的操作1.1 清理系统缓存文件1.2 磁盘清…

实战精选 | 如何在一台 Linux AI PC 上高效运行 OpenVINO™

点击蓝字 关注我们 作者&#xff1a;Adrian Boguszewski&#xff0c;英特尔 AI 软件布道师 武卓博士&#xff0c;英特尔 AI 软件布道师 什么是 AI PC&#xff0c;为什么它有一个特殊的名字&#xff1f; AI PC 是时下 PC 领域的一个热门话题。与普通 PC 不同&#xff0c;AI PC 配…

AI绘画Stable Diffusion超现实风格电商场景,五个电商专用LoRA分享,制作电商场景变现教程!

前言 本次教程将使用AI绘画工具 Stable Diffusion 进行讲解&#xff0c;如还未安装SD的小伙伴可以看我往期入门教程2024最新超强AI绘画Stable Diffusion整合包安装教程&#xff0c;一键教你本地部署&#xff01;&#xff0c;安装包请扫描免费获取哦https://blog.csdn.net/z199…

招采全流程电子化优势及重要功能环节(数智化招采系统)

招投标全流程电子化&#xff0c;是加速招标采购领域数字化转型、创新招标采购交易机制的重要举措。它在构建高效规范、公平竞争、充分开放的大市场环境中起着至关重要的作用。 招采电子化历史沿革 2013年2月&#xff0c;国家发展改革委等八部门发布了《电子招标投标办法》&am…

七款好用的电脑监控软件推荐|电脑屏幕监控软件最新整理!

电脑监控软件在家庭和企业环境中变得越来越重要。它们帮助父母监督孩子的在线活动&#xff0c;也帮助企业确保员工在工作时间内的生产力和数据安全。以下是七款优秀的电脑监控软件推荐&#xff0c;希望能帮助您选择。 固信软件https://www.gooxion.com/ 固信软件 固信软件提供…

Java基础-组件及事件处理(下)

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 面板组件 说明 常见组件 JScrollPane常用构造方法 JScrollPane设置面板滚动策略的方法 JScrollPane滚…

为什么广告需要教育视频

教育视频作为一种广告工具越来越受欢迎&#xff0c;因为它们能够有效地传达信息并吸引观众的注意力。以下是需要此类视频的几个关键原因&#xff1a; 提高参与度 互动性&#xff1a;教育视频吸引注意力&#xff0c;让观众长时间参与&#xff0c;并让他们参与学习过程。产品演…

测试用例设计思路与常用方法

作为测试人员&#xff0c;测试用例设计在工作中的占比是很高的&#xff0c;而且是非常重要的一步&#xff0c;测试用例设计的好坏关系到测试执行过程中的场景覆盖是否完全&#xff0c;最后体现到测试质量是否有保障&#xff0c;所以在这一步做好了不仅能够提高测试效率&#xf…

Windows中安装部署MinIo文件系统,在Spring Boot中引入MinIo依赖实现上传文件到MinIo文件系统中

minio安装部署可以看这篇教程&#xff1a;https://blog.csdn.net/qq_43108153/article/details/134016896 创建桶 将私有设置成公开 导入依赖 <!-- minio --> <dependency><groupId>io.minio</groupId><artifactId>minio</artifactId>…

【后端开发实习】用Nodejs操作mongodb结合Mongoose实现数据库操作

用Nodejs操作mongodb结合Schema实现数据库操作 Mongoose创建Schema定义Schema对象并映射到数据库Model的使用创建文档内容删除文档内容修改文档内容查询文档内容 Document的使用创建并保存将文档对象转换为JSON对象 模块化数据库连接模型初始化 项目部署路由定义后端操作定义启…

如何评价《沧浪之水》这本书?

1、我一辈子的经验就是不要做瞎子&#xff0c;要把事情看清楚&#xff0c;也不能做聋子&#xff0c;该听到的信息要听到&#xff0c;但是要做哑巴&#xff0c;看到了听到了心中有数就行了&#xff0c;可千万别张口说什么。 2、说是人人平等&#xff0c;那是安慰小人物的神话&am…