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

从理论到实践网络编程模型:(BIO、NIO、AIO)同步与异步模型的原理与应用 (五)

Socket(套接字)

是网络编程中的一个重要概念,它是计算机网络中通信的基本操作单元。通过套接字,程序可以在网络上进行数据交流。简单来说,Socket是一个软件结构,完成三次握手它允许应用程序通过网络发送和接收数据,属于划分的五个层次的应用层。(不清楚的可以看专栏前面的文章中有些)

Socket的主要功能

  1. 通信:通过Socket,应用程序可以在不同计算机之间进行数据传输。
  2. 网络协议:Socket支持多种网络协议,包括TCP(传输控制协议)和UDP(用户数据报协议)
  3. 端口管理:Socket可以通过端口与网络上的其他应用程序进行区分,确保数据能够正确到达目标应用。这个要自己去定,一台电脑有65536个端口,可以完成65536×65536个连接。前后端分离开发就是通过端口来交流。
  4. 数据流管理:Socket可以处理流式数据,使得数据的发送和接收更加高效。上一篇有写Java的流处理

Java中的Socket实现

在Java中,Socket编程主要依赖于java.net包中的类。最常用的类有SocketServerSocket。下面是一个简单的示例,展示如何在Java中实现基于Socket的网络通信。

1. TCP Socket编程示例

服务器端

以下是一个简单的TCP服务器的实现:

import java.io.*;
import java.net.*;public class SimpleServer {public static void main(String[] args) {try (ServerSocket serverSocket = new ServerSocket(7000)) {System.out.println("服务器已启动,等待客户端连接...");while (true) {Socket clientSocket = serverSocket.accept(); // 等待客户端连接System.out.println("客户端连接: " + clientSocket.getInetAddress());// 创建输入输出流BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);String message;while ((message = in.readLine()) != null) {System.out.println("收到消息: " + message);out.println("服务器回复: " + message); // 回应客户端}// 关闭连接in.close();out.close();clientSocket.close();}} catch (IOException e) {e.printStackTrace();}}
}
BS架构(Browser/Server Architecture)
1. 定义

BS架构是指基于浏览器的网络架构模型,客户端通过浏览器访问服务器上的应用。服务器负责处理所有的业务逻辑和数据存储。

2. 特点
  • 无客户端安装:用户只需使用浏览器访问服务,无需安装额外的软件。
  • 集中管理:应用程序和数据集中在服务器端,便于管理和维护。
  • 跨平台:由于浏览器的广泛使用,BS架构几乎可以在所有操作系统上运行。
3. 优势
  • 易于部署:只需要更新服务器端,所有用户皆可立即获得最新版本。
  • 成本效益:减少了客户端的维护成本,简化了IT管理。
  • 易于访问:用户可以在任何设备上,只要有浏览器和网络连接即可访问。
4. 劣势
  • 性能限制:浏览器对性能的限制可能会影响用户体验,尤其是在复杂计算和图形处理上。
  • 安全性:面临更多的网络安全风险,因数据在网络中传输。
  • 功能限制:某些高级功能可能不易在浏览器中实现。

客户端

以下是一个简单的TCP客户端的实现:

import java.io.*;
import java.net.*;public class SimpleClient {public static void main(String[] args) {try (Socket socket = new Socket("localhost", 7000); // 连接到服务器PrintWriter out = new PrintWriter(socket.getOutputStream(), true);BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()))) {// 发送消息到服务器out.println("Hello, Server!");String response = in.readLine(); // 接收服务器的响应System.out.println("服务器回复: " + response);} catch (IOException e) {e.printStackTrace();}}
}

代码说明

  1. ServerSocket:用于创建一个服务器端的Socket,监听特定的端口(在这里是7000)。
  2. Socket:一旦客户端请求连接,服务器端接受该请求,创建一个Socket对象与客户端进行通信。
  3. 输入输出流
    • 输入流:服务器通过BufferedReader读取客户端发送的信息。
    • 输出流:使用PrintWriter向客户端发送响应。
  4. 连接管理:服务器在接收完客户端的消息后,关闭连接。
CS架构(Client/Server Architecture)
1. 定义

CS架构是指一种网络架构模型,其中客户端(Client)和服务器(Server)之间通过网络进行交互。客户端通常是一个桌面应用程序,直接与服务器进行数据交换。

2. 特点
  • 客户端应用程序:客户端需要安装专门的应用程序,通常是桌面软件。
  • 功能强大:由于可以利用客户端设备的资源,CS架构可以实现复杂的业务逻辑和界面。
  • 网络连接:客户端与服务器之间建立持久连接,通常采用TCP/IP协议。
  • 安全性:相对较高,数据和业务逻辑通常在服务器端处理,减少了客户端的安全隐患。
3. 优势
  • 性能:客户端可以进行复杂的计算和处理,减少服务器负担。
  • 用户体验:丰富的用户界面和交互能力。
  • 离线功能:部分客户端应用可以在没有网络连接的情况下运行。
4. 劣势
  • 维护成本:需要在每个客户端上安装和升级软件,维护成本较高。
  • 兼容性:可能存在不同操作系统和硬件配置之间的兼容性问题。
  • 网络依赖:依赖于网络的稳定性和速度。

总结

  • Socket是网络通信的基础,通过Socket可以实现客户端与服务器之间的数据交换。
  • 在Java中,通过SocketServerSocket类可以方便地实现基于TCP的网络通信。
  • 以上示例展示了基本的Socket使用,您可以根据需要扩展功能,例如处理多个客户端连接或添加异常处理逻辑。

下面是关于 BS 架构(Browser/Server,浏览器-服务器架构)和 CS 架构(Client/Server,客户机-服务器架构)的详细比较及解释。

特性CS架构BS架构
客户端需要安装专用应用无需安装,使用浏览器访问
资源利用可利用客户端资源依赖服务器资源
部署和维护复杂,需逐个更新客户端简单,集中更新服务器
跨平台兼容性可能存在兼容性问题跨平台,依赖浏览器
用户体验更丰富的界面和交互受限于浏览器的能力
安全性较高,但需保护客户端面临网络安全风险

CS架构适合对性能要求高、需要复杂计算的应用,而BS架构则更适合需要广泛访问、易于维护的应用。
这个只是一个简单的实现,之后会有个更加难的实现方法,运用bio实现聊天功能的。万丈高楼平地起。持续更新中~~

  • 从理论到实践网络编程模型:(BIO、NIO、AIO)同步与异步模型的原理与应用 (一)
  • 从理论到实践网络编程模型:(BIO、NIO、AIO)同步与异步模型的原理与应用 (二)
  • 从理论到实践网络编程模型:(BIO、NIO、AIO)同步与异步模型的原理与应用 (三)
  • 从理论到实践网络编程模型:(BIO、NIO、AIO)同步与异步模型的原理与应用 (四)

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • shell脚本编程实践(五)
  • 刷完Armbian的盒子后根目录空间太小解决方案
  • 高阶数据结构——LRU Cache
  • pod详解 list-watch机制 预选优选策略 如何指定节点调度pod
  • 10.1 使用ansible部署 redis-exporter
  • Python 机器学习求解 PDE 学习项目 基础知识(3)matplotlib 画函数热图
  • 十六、【Python】基础教程 - 【Flask】网络编程开发
  • SpringBoot可以同时处理多少请求?
  • WHAT - xmlhttprequest vs fetch vs wretch
  • YOLO系列:从yolov1至yolov8的进阶之路 持续更新中
  • 【数据结构】队列,你必须知道的内部原理!!!
  • 大数据Flink(一百零九):阿里云Flink的基本名称概念
  • 保障速度与安全合规的前提下,如何传文件到国外?
  • 【解压既玩】PS3模拟器v0.0.32+战神3+战神升天+各存档 整合包 ,完美不死机,没有BUG,旷世神作,强力推荐
  • AI编程工具合集整理优缺点
  • [case10]使用RSQL实现端到端的动态查询
  • C学习-枚举(九)
  • Java教程_软件开发基础
  • Java知识点总结(JavaIO-打印流)
  • Material Design
  • Redux系列x:源码分析
  • spring + angular 实现导出excel
  • spring学习第二天
  • 老板让我十分钟上手nx-admin
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 手写双向链表LinkedList的几个常用功能
  • 思维导图—你不知道的JavaScript中卷
  • 温故知新之javascript面向对象
  • 小程序测试方案初探
  • 小李飞刀:SQL题目刷起来!
  • 以太坊客户端Geth命令参数详解
  • 异常机制详解
  • d²y/dx²; 偏导数问题 请问f1 f2是什么意思
  • ionic异常记录
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • 整理一些计算机基础知识!
  • ​​​​​​​GitLab 之 GitLab-Runner 安装,配置与问题汇总
  • ​​​​​​​STM32通过SPI硬件读写W25Q64
  • # 利刃出鞘_Tomcat 核心原理解析(八)-- Tomcat 集群
  • #Z0458. 树的中心2
  • #Z2294. 打印树的直径
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • (175)FPGA门控时钟技术
  • (2022版)一套教程搞定k8s安装到实战 | RBAC
  • (不用互三)AI绘画:科技赋能艺术的崭新时代
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (二)丶RabbitMQ的六大核心
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (原創) 如何將struct塞進vector? (C/C++) (STL)
  • (转)Linq学习笔记
  • ***利用Ms05002溢出找“肉鸡
  • .form文件_SSM框架文件上传篇
  • .NET Framework Client Profile - a Subset of the .NET Framework Redistribution
  • .NET MAUI Sqlite数据库操作(二)异步初始化方法