Java进阶之旅-day05:网络编程

引言

        在当今数字化的时代,网络编程在软件开发中扮演着至关重要的角色。Java 作为一门广泛应用的编程语言,提供了强大的网络编程能力。今天,我们深入学习了 Java 网络编程的基础知识,包括基本的通信架构、网络编程三要素、IP 地址、TCP 协议、UDP 通信等内容。接下来,我们将对这些知识点进行详细的总结。

基本的通信架构

        在网络编程中,常见的通信架构有客户端 - 服务器(Client - Server,C/S)架构和浏览器 - 服务器(Browser - Server,B/S)架构。

C/S 架构

        客户端 - 服务器架构是一种传统的网络通信模式。在这种架构中,客户端程序向服务器发送请求,服务器接收到请求后进行处理,并将处理结果返回给客户端。例如,我们使用的 QQ、微信等即时通讯软件就是典型的 C/S 架构应用。以下是一个简单的 C/S 架构 Java 示例,模拟客户端向服务器发送消息:

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;// 服务器端
class SimpleServer {public static void main(String[] args) {try (ServerSocket serverSocket = new ServerSocket(12345)) {System.out.println("Server is listening on port 12345");Socket socket = serverSocket.accept();BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));String message = in.readLine();System.out.println("Received from client: " + message);socket.close();} catch (IOException e) {e.printStackTrace();}}
}// 客户端
class SimpleClient {public static void main(String[] args) {try (Socket socket = new Socket("localhost", 12345);PrintWriter out = new PrintWriter(socket.getOutputStream(), true)) {String message = "Hello, Server!";out.println(message);} catch (IOException e) {e.printStackTrace();}}
}

B/S 架构

        浏览器 - 服务器架构是一种基于 Web 技术的网络通信模式。在这种架构中,客户端只需要通过浏览器访问服务器上的网页,服务器将网页内容返回给浏览器进行显示。例如,我们日常使用的各种网站就是 B/S 架构的应用。以下是一个简单的 Java Servlet 示例模拟 B/S 架构的服务器端处理:

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;@WebServlet("/hello")
public class HelloServlet extends HttpServlet {protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("text/html");PrintWriter out = response.getWriter();out.println("<html><body>");out.println("<h1>Hello, World!</h1>");out.println("</body></html>");}
}

网络编程三要素

        网络编程的三要素包括 IP 地址、端口号和协议。

IP 地址

        IP 地址是互联网协议地址的缩写,它是用于标识网络中设备的唯一标识符。通过 IP 地址,不同设备之间可以进行通信。

端口号

        端口号是用于标识应用程序的数字。在一台设备上,可能同时运行着多个应用程序,每个应用程序通过不同的端口号来接收和发送数据。端口号的范围是 0 - 65535,其中 0 - 1023 通常被系统保留使用。

协议

        协议是网络通信中双方必须遵循的规则和约定。常见的网络协议有 TCP(传输控制协议)和 UDP(用户数据报协议),我们将在后面详细介绍这两种协议。

IP 地址详解

IP 地址的作用

        IP 地址的主要作用是在网络中唯一标识一台设备,使得不同设备之间能够进行通信。就像我们的家庭地址一样,通过 IP 地址,数据可以准确地从源设备传输到目标设备。

IP 地址的分类

        IP 地址主要分为 IPv4 和 IPv6 两种类型。

IPv4

        IPv4 是目前广泛使用的 IP 地址版本,它由 32 位二进制数组成,通常用点分十进制表示,例如 192.168.1.1。由于 IPv4 地址空间有限,随着互联网的发展,IPv4 地址已经逐渐耗尽。

IPv6

        IPv6 是为了解决 IPv4 地址不足的问题而推出的新一代 IP 地址版本。它由 128 位二进制数组成,采用冒号十六进制表示,例如 2001:0db8:85a3:0000:0000:8a2e:0370:7334。IPv6 提供了巨大的地址空间,可以满足未来互联网发展的需求。

公网 IP 和 内网 IP

公网 IP

        公网 IP 是可以直接在互联网上访问的 IP 地址。每个公网 IP 地址在全球范围内都是唯一的。通常,企业、机构和互联网服务提供商(ISP)会拥有公网 IP 地址。

内网 IP

        内网 IP 是用于局域网内部通信的 IP 地址。内网 IP 地址在局域网内部是唯一的,但在不同的局域网中可以重复使用。常见的内网 IP 地址段有 10.0.0.0 - 10.255.255.255172.16.0.0 - 172.31.255.255 和 192.168.0.0 - 192.168.255.255

查看本机 IP 地址

Windows 系统

        在 Windows 系统中,可以通过以下步骤查看本机 IP 地址:

  1. 打开命令提示符(CMD)。
  2. 在命令提示符中输入 ipconfig 命令,按下回车键。
  3. 在输出结果中,可以找到本机的 IP 地址信息。
Linux 系统

        在 Linux 系统中,可以通过以下命令查看本机 IP 地址:

ifconfig
macOS 系统

        在 macOS 系统中,可以通过以下步骤查看本机 IP 地址:

  1. 打开 “系统偏好设置”。
  2. 点击 “网络”。
  3. 在左侧列表中选择当前连接的网络,右侧会显示本机的 IP 地址信息。

查看是否与对方互通

        可以使用 ping 命令来测试是否与对方设备互通。在命令提示符或终端中输入以下命令:

ping 对方 IP 地址

如果能够收到对方设备的响应,表示与对方设备互通;如果无法收到响应,则可能存在网络连接问题。

本机 IP

        本机 IP 是指当前设备在网络中的 IP 地址。在局域网中,本机 IP 通常是内网 IP 地址;如果设备直接连接到互联网,则本机 IP 是公网 IP 地址。

TCP 协议特点

        TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层协议。它具有以下特点:

面向连接

        在进行数据传输之前,TCP 会先建立连接,确保双方设备都处于可用状态。连接建立后,双方可以进行数据传输,传输完成后,再关闭连接。

可靠传输

        TCP 通过确认机制、重传机制和滑动窗口机制等保证数据的可靠传输。如果发送方发送的数据没有收到接收方的确认信息,发送方会重新发送该数据。

字节流传输

        TCP 将应用层的数据看作是无结构的字节流进行传输,接收方需要根据应用层的协议来解析这些字节流。

拥塞控制

        TCP 具有拥塞控制机制,当网络出现拥塞时,TCP 会自动调整发送数据的速率,以避免网络拥塞进一步恶化。

UDP 通信

        UDP(用户数据报协议)是一种无连接的、不可靠的传输层协议。与 TCP 不同,UDP 在进行数据传输之前不需要建立连接,也不保证数据的可靠传输。UDP 的特点是传输速度快、开销小,适用于对实时性要求较高、对数据准确性要求相对较低的应用场景,例如视频直播、音频通话等。

以下是一个简单的 Java UDP 通信示例:

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;// UDP 发送端
class UDPSender {public static void main(String[] args) throws IOException {// 创建 DatagramSocket 对象DatagramSocket socket = new DatagramSocket();// 要发送的数据String message = "Hello, UDP!";byte[] sendData = message.getBytes();// 目标地址和端口InetAddress address = InetAddress.getByName("localhost");int port = 8888;// 创建 DatagramPacket 对象DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, address, port);// 发送数据socket.send(sendPacket);// 关闭套接字socket.close();}
}// UDP 接收端
class UDPReceiver {public static void main(String[] args) throws IOException {// 创建 DatagramSocket 对象,并指定端口号DatagramSocket socket = new DatagramSocket(8888);// 创建接收数据的缓冲区byte[] receiveData = new byte[1024];// 创建 DatagramPacket 对象DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);// 接收数据socket.receive(receivePacket);// 解析接收到的数据String message = new String(receivePacket.getData(), 0, receivePacket.getLength());System.out.println("Received: " + message);// 关闭套接字socket.close();}
}

TCP 通信

        TCP 通信是一种面向连接的通信方式,需要先建立连接,再进行数据传输,最后关闭连接。以下是一个简单的 Java TCP 通信示例:

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;// TCP 服务器端
class TCPServer {public static void main(String[] args) {try (ServerSocket serverSocket = new ServerSocket(9999)) {System.out.println("Server is listening on port 9999...");// 等待客户端连接Socket socket = serverSocket.accept();System.out.println("Client connected: " + socket.getInetAddress());// 获取输入流BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));// 获取输出流PrintWriter out = new PrintWriter(socket.getOutputStream(), true);// 读取客户端发送的数据String inputLine;while ((inputLine = in.readLine()) != null) {System.out.println("Received from client: " + inputLine);// 向客户端发送响应out.println("Server received: " + inputLine);}// 关闭连接socket.close();} catch (IOException e) {e.printStackTrace();}}
}// TCP 客户端
class TCPClient {public static void main(String[] args) {try (Socket socket = new Socket("localhost", 9999);PrintWriter out = new PrintWriter(socket.getOutputStream(), true);BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in))) {String userInput;while ((userInput = stdIn.readLine()) != null) {// 向服务器发送数据out.println(userInput);// 读取服务器的响应String response = in.readLine();System.out.println("Received from server: " + response);}} catch (IOException e) {e.printStackTrace();}}
}

综合案例

        假设我们要实现一个简单的文件传输系统,客户端将本地文件发送给服务器,服务器接收文件并保存到本地。以下是一个基于 TCP 协议的文件传输系统的示例代码:

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;// 文件传输服务器端
class FileTransferServer {public static void main(String[] args) {try (ServerSocket serverSocket = new ServerSocket(12345)) {System.out.println("Server is listening on port 12345...");// 等待客户端连接Socket socket = serverSocket.accept();System.out.println("Client connected: " + socket.getInetAddress());// 获取输入流InputStream in = socket.getInputStream();// 创建文件输出流FileOutputStream fos = new FileOutputStream("received_file.txt");byte[] buffer = new byte[4096];int bytesRead;while ((bytesRead = in.read(buffer)) != -1) {fos.write(buffer, 0, bytesRead);}// 关闭流和连接fos.close();in.close();socket.close();System.out.println("File received successfully.");} catch (IOException e) {e.printStackTrace();}}
}// 文件传输客户端
class FileTransferClient {public static void main(String[] args) {try (Socket socket = new Socket("localhost", 12345);FileInputStream fis = new FileInputStream("test_file.txt");OutputStream out = socket.getOutputStream()) {byte[] buffer = new byte[4096];int bytesRead;while ((bytesRead = fis.read(buffer)) != -1) {out.write(buffer, 0, bytesRead);}// 关闭流和连接fis.close();out.close();socket.close();System.out.println("File sent successfully.");} catch (IOException e) {e.printStackTrace();}}
}

总结

        通过今天的学习,我们对 Java 网络编程有了更深入的了解。掌握了基本的通信架构、网络编程三要素、IP 地址、TCP 协议和 UDP 通信等基础知识,并通过实际的代码示例加深了对这些知识的理解和应用。网络编程是 Java 开发中非常重要的一部分,在实际项目中有着广泛的应用,我们需要不断学习和实践,才能更好地掌握这门技术。

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

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

相关文章

大数据(4.3)Hive基础查询完全指南:从SELECT到复杂查询的10大核心技巧

目录 背景一、Hive基础查询核心语法1. 基础查询&#xff08;SELECT & FROM&#xff09;2. 条件过滤&#xff08;WHERE&#xff09;3. 聚合与分组&#xff08;GROUP BY & HAVING&#xff09;4. 排序与限制&#xff08;ORDER BY & LIMIT&#xff09; 二、复杂查询实战…

Synopsys:设计对象

相关阅读 Synopsyshttps://blog.csdn.net/weixin_45791458/category_12812219.html?spm1001.2014.3001.5482 对于Synopsys的EDA工具&#xff08;如Design Compiler、PrimeTime、IC Compiler&#xff09;等&#xff0c;设计对象(Design Objects)是组成整个设计的抽象表示&…

【愚公系列】《高效使用DeepSeek》053-工艺参数调优

🌟【技术大咖愚公搬代码:全栈专家的成长之路,你关注的宝藏博主在这里!】🌟 📣开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主! 👉 江湖人称"愚公搬代码",用七年如一日的精神深耕技术领域,以"…

深度学习篇---模型训练(1)

文章目录 前言一、库导入与配置部分介绍 二、超参数配置简介 三、模型定义1. 改进残差块2. 完整CNN模型 四、数据集类五、数据加载函数六、训练函数七、验证函数八、检查点管理九、主函数十、执行入口十一、关键设计亮点总结1.维度管理2.数据标准化3.动态学习率4.梯度剪裁5.检查…

题解:AT_abc241_f [ABC241F] Skate

一道经典的 bfs 题。 提醒&#xff1a;本题解是为小白专做的&#xff0c;不想看的大佬请离开。 这道题首先一看就知道是 bfs&#xff0c;但是数据点不让我们过&#xff1a; 1 ≤ H , W ≤ 1 0 9 1\le H,W\le10^9 1≤H,W≤109。 那么我们就需要优化了&#xff0c;从哪儿下手…

【含文档+PPT+源码】基于微信小程序的乡村振兴民宿管理系统

项目介绍 本课程演示的是一款基于微信小程序的乡村振兴民宿管理系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套系统 3.该…

STM32定时器通道1-4(CH1-CH4)的引脚映射关系

以下是 STM32定时器通道1-4(CH1-CH4)的引脚映射关系的详细说明,以常见型号为例。由于不同系列/型号差异较大,请务必结合具体芯片的参考手册确认。 一、STM32F1系列(如STM32F103C8T6) 1. TIM1(高级定时器) 通道默认引脚重映射引脚(部分/完全)备注CH1PA8无互补输出CH1…

bge-m3+deepseek-v2-16b+离线语音能力实现离线文档向量化问答语音版

ollama run deepseek-v2:16b ollama pull bge-m3 1、离线听写效果的大幅度提升。50M 1.3G&#xff08;每次初始化都会很慢&#xff09;---优化到首次初始化使用0延迟响应。 2、文档问答历史问题处理与优化&#xff0c;文档问答离线策略讨论与参数暴露。 3、离线大模型答复中断…

前端界面在线excel编辑器 。node编写post接口获取文件流,使用传参替换表格内容展示、前后端一把梭。

首先luckysheet插件是支持在线替换excel内容编辑得但是浏览器无法调用本地文件&#xff0c;如果只是展示&#xff0c;让后端返回文件得二进制文件流就可以了&#xff0c;直接使用luckysheet展示。 这里我们使用xlsx-populate得node简单应用来调用本地文件&#xff0c;自己写一个…

JavaScript学习20-Event事件对象

1.属性 即点击谁就打印出来谁 2.方法 未添加stopPropagatio方法&#xff1a; 添加stopPropagatio方法后&#xff1a;

FreeRTOS 启动过程中 SVC 和 PendSV 的工作流程​

在 FreeRTOS 的启动过程中,SVC(Supervisor Call) 和 PendSV(Pendable Service Call) 是两个关键的系统异常,分别用于 首次任务启动 和 任务上下文切换。它们的协作确保了从内核初始化到多任务调度的平滑过渡。以下是详细的工作流程分析(以 ARM Cortex-M 为例): 1. SVC…

[自制调试工具]构建高效调试利器:Debugger 类详解

一、引言 在软件开发的漫漫征程中&#xff0c;调试就像是一位忠诚的伙伴&#xff0c;时刻陪伴着开发者解决代码里的各类问题。为了能更清晰地了解程序运行时变量的状态&#xff0c;我们常常需要输出各种变量的值。而 Debugger 类就像是一个贴心的调试助手&#xff0c;它能帮我…

foobar2000 VU Meter Visualisation 插件汉化版 VU表

原英文插件点此 界面展示 下载 https://wwtn.lanzout.com/iheI22ssoybi 安装方式 解压安装文件&#xff0c;文件名为&#xff1a;foo_vis_vumeter-0.10.2_CHINIESE.fb2k-component

消息中间件对比与选型指南:Kafka、ActiveMQ、RabbitMQ与RocketMQ

目录 引言 消息中间件的定义与作用 消息中间件在分布式系统中的重要性 对比分析的四种主流消息中间件概述 消息中间件核心特性对比 消息传递模型 Kafka&#xff1a;专注于发布-订阅模型 ActiveMQ&#xff1a;支持点对点和发布-订阅两种模型 RabbitMQ&#xff1a;支持点…

liunx输入法

1安装fcitx5 sudo apt update sudo apt install fcitx fcitx-pinyin 2配置为默认输入法 设置-》系统-》区域和语言 点击系统弹出语言和支持选择键盘输入法系统 3设置设置 fcitx-configtool 如果没显示需要重启电脑 4配置fcitx 把搜狗输入法放到第一位&#xff08;点击下面…

WindowsPE文件格式入门05.PE加载器LoadPE

https://bpsend.net/thread-316-1-1.html LoadPE - pe 加载器 壳的前身 如果想访问一个程序运行起来的内存,一种方法就是跨进程读写内存,但是跨进程读写内存需要来回调用api,不如直接访问地址来得方便,那么如果我们需要直接访问地址,该怎么做呢?.需要把dll注进程,注进去的代码…

QGIS中第三方POI坐标偏移的快速校正-百度POI

1.百度POI&#xff1a; name,lng,lat,address 龙记黄焖鸡米饭(共享区店),121.908315,30.886636,南汇新城镇沪城环路699弄117号(A1区110室) 好福记黄焖鸡(御桥路店),121.571409,31.162292,沪南路2419弄26号1层B间 御品黄焖鸡米饭(安亭店),121.160322,31.305977,安亭镇新源路792号…

SQL的调优方案

一、前言 SQL调优是提升数据库性能的关键手段。需结合索引优化、SQL语句优化、执行计划分析及数据库架构设计等多方面综合处理。 二、索引优化 创建合适索引 高频查询字段&#xff1a;对WHERE、JOIN、ORDER BY涉及的字段创建索引&#xff0c;尤其是区分度高的字段&#xff08…

【项目管理】第一部分 信息技术 1/2

相关文档&#xff0c;希望互相学习&#xff0c;共同进步 风123456789&#xff5e;-CSDN博客 概要 知识点&#xff1a; 现代化基础设施、数字经济、工业互联网、车联网、智能制造、智慧城市、数字政府、5G、常用数据库类型、数据仓库、信息安全、网络安全态势感知、物联网、大数…

【玩泰山派】1、mac上使用串口连接泰山派

文章目录 前言picocom工具连接泰山派安装picocom工具安装ch340的驱动串口工具接线使用picocom连接泰山派 参考 前言 windows上面有xshell这个好用的工具可以使用串口连接板子&#xff0c;在mac上好像没找到太好的工具&#xff0c;只能使用命令行工具去搞了。 之前查找说mac上…