商城项目回顾

哈哈,准备期末考试去了,项目停了一段时间。现在又忘的差不多了。所以专门写一篇博客总结前期项目的知识点。


Client软件包

代码加总结:

这段代码实现了一个简单的客户端程序,用于与服务器建立连接、发送登录信息并接收服务器的响应。它展示了如何使用 Java 的 Socket 和对象流来进行网络通信和对象传输,以及如何处理相关的异常情况。

package Client;

import common.Message;
import common.MessageType;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;

public class CheckUser {
    private Socket socket;
    public  boolean login(Message message)  {//登录
        try {
            //创建一个新的Socket连接到指定的IP地址和端口号
            socket = new Socket("127.0.0.1", 10086);

            //获取Socket输出流,并包装成ObjectOutputStream以便可以发送对象
            ObjectOutputStream oos=new ObjectOutputStream(socket.getOutputStream());

            //发送登录消息到服务器
            oos.writeObject(message);

            //获取Socket的输入流,并包装成ObjectInputStream以便可以接收对象
            ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
            //反序列化强转为String类型,提示信息

            //从服务器接收对象,并尝试将其强制转换为Message类型
            //这里假设服务器返回的对象是Message类型,并且包含了登录的结果信息
            Message message1 = (Message) ois.readObject();

            //检查返回的Message对象的MassageType属性是否为登录成功
            //注意:这里应该使用equals进行比较枚举值
            if(message1.MessageType.equals(MessageType.loginsuccefull)){
                return true;
            }else return false;
        } catch (IOException e) {
            // 如果在Socket通信过程中发生IO异常,捕获该异常并抛出一个运行时异常
            // 这样做通常是为了简化异常处理,但也可能导致调用者难以处理特定类型的IO异常
            throw new RuntimeException(e);
            // 注释:捕获了与Socket通信相关的IO异常,并重新包装为运行时异常抛出
        } catch (ClassNotFoundException e) {
            // 如果在尝试反序列化对象时找不到类的定义,则捕获此异常
            // 这通常意味着服务器发送的对象类型在客户端的类路径中不存在
            throw new RuntimeException(e);
            // 注释:捕获了反序列化对象时找不到类的定义的情况,并重新包装为运行时异常抛出
        }
    }

    public  boolean SignIn(Message message)  {//注册
        try {
            //创建一个新的Socket连接到指定的IP地址和端口号
            socket = new Socket("127.0.0.1", 10086);

            //获取Socket输出流,并包装成ObjectOutputStream以便可以发送对象
            ObjectOutputStream oos=new ObjectOutputStream(socket.getOutputStream());

            //发送注册消息到服务器
            oos.writeObject(message);

            //获取Socket的输入流,并包装成ObjectInputStream以便可以接收对象
            ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
            //反序列化强转为String类型,提示信息

            //从服务器接收对象,并尝试将其强制转换为Message类型
            //这里假设服务器返回的对象是Message类型,并且包含了注册的结果信息
            Message message1 = (Message) ois.readObject();

            //检查返回的Message对象的MassageType属性是否为登录成功
            //注意:这里应该使用equals进行比较枚举值
            if(message1.MessageType.equals(MessageType.RegistrationSuccessfully)){
                return true;
            }else return false;
        } catch (IOException e) {
            // 如果在Socket通信过程中发生IO异常,捕获该异常并抛出一个运行时异常
            // 这样做通常是为了简化异常处理,但也可能导致调用者难以处理特定类型的IO异常
            throw new RuntimeException(e);
            // 注释:捕获了与Socket通信相关的IO异常,并重新包装为运行时异常抛出
        } catch (ClassNotFoundException e) {
            // 如果在尝试反序列化对象时找不到类的定义,则捕获此异常
            // 这通常意味着服务器发送的对象类型在客户端的类路径中不存在
            throw new RuntimeException(e);
            // 注释:捕获了反序列化对象时找不到类的定义的情况,并重新包装为运行时异常抛出
        }
    }


}

详细疏解知识点:

看懂代码的朋友们就可以不用看这段总结了,这段总结会非常基础。

1.private 是什么意思?

private是访问修饰符的一种。

JAVA的权限修饰符_java的访问修饰符权限-CSDN博客

 2.Socket是什么意思?
  • 定义:Socket是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个Socket就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。
  • 功能:Socket作为网络通信的编程接口,允许应用程序将I/O插入到网络中,并与网络中的其他应用程序进行通信。它是实现网络通信的基础,无论是浏览网页、发送电子邮件,还是流式传输视频,这些操作背后都有Socket在工作。
  • 工作原理:一个应用程序通过创建一个Socket,并指定相应的网络协议(如TCP/IP)、IP地址和端口号等参数,然后通过这个Socket进行通信。通信过程包括建立连接、发送数据、接收数据以及关闭连接等步骤。
3.通信协议与网络协议

  • 通信协议:是指双方实体完成通信或服务所必须遵循的规则和约定。它主要用于定义发送方和接收方如何发送和接收数据,以及如何处理发生的错误。通信协议还负责定义传输的数据的格式,以及数据的结构和语义。这些协议常用于点对点通信,特别是在传统的电话通信领域被广泛应用。常见的通信协议包括HTTP、SMTP、FTP、SSH、Telnet、IMAP和POP3等。

通信协议分层思想是将网络通信过程划分为多个独立的层次,每个层次负责不同的功能,并通过接口与相邻层次进行交互。这种分层结构使得网络通信过程更加模块化,每一层只关注自己的任务,从而简化了网络设计和实现的复杂性。

分层模型示例

1. OSI七层参考模型

OSI(Open Systems Interconnection,开放式系统互联)模型是国际标准化组织(ISO)在20世纪80年代制定的一种通信协议分层模型,它将网络通信划分为七个层次,从上到下依次为:

  • 应用层:直接为用户的应用程序提供服务,如文件传输、电子邮件等。
  • 表示层:负责数据的编码、转换和压缩,确保数据在不同系统间正确传输。
  • 会话层:负责建立、管理和终止会话,保证数据在会话中的正确传输。
  • 传输层:提供端到端的可靠数据传输服务,如TCP协议。
  • 网络层:负责数据的路由选择和转发,如IP协议。
  • 数据链路层:负责在物理链路上无差错地传输数据帧。
  • 物理层:定义物理传输介质和信号格式,如双绞线、光纤等。

2. TCP/IP四层模型

TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/网际协议)模型是互联网中广泛使用的通信协议分层模型,它将网络通信划分为四个层次:

  • 应用层:与OSI模型的应用层相似,负责用户应用程序之间的数据通信。
  • 传输层:提供端到端的数据传输服务,包括TCP和UDP两种协议
  • 网络层:负责数据的路由选择和转发,主要协议为IP。
  • 网络接口层(有时也称为链路层):负责在物理网络上传输数据帧,包含各种硬件协议如以太网等。
  • 网络协议:是指互联网上各个计算机之间进行数据传输和交换所必须共同遵循的规范。它包含了大量的细节和约定,如IP地址、TCP/UDP协议、ARP协议等。网络协议的设计目标是帮助计算机实现可靠、高效和安全的网络通信。网络协议是网络上所有设备之间通信规则的集合,它规定了通信时信息必须采用的格式和这些格式的意义。
4.TCP/UDP协议

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

TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)是计算机网络中两种主要的传输层协议,它们各自具有独特的特点和适用场景。以下是TCP和UDP之间的详细比较:

连接性

TCP:面向连接的协议。在数据传输之前,TCP需要通过三次握手过程建立连接,确保双方通信的同步性。

UDP:无连接的协议。UDP发送方直接将数据包发送给接收方,无需建立连接。

可靠性

TCP:提供可靠的数据传输。使用确认和重传机制来确保数据的完整性,如果数据包在传输过程中丢失或损坏,TCP会重新发送。

UDP:不提供可靠的数据传输。数据包可能丢失、重复或乱序到达,接收方不会发送确认信号,发送方也不会重传丢失的数据包。

顺序性

TCP:保证数据按序到达。每个TCP数据包都有一个序列号,接收方会按照序列号重新排序数据包。

UDP:不保证数据顺序。数据包可能以任何顺序到达接收方。

流量控制和拥塞控制

TCP:提供流量控制和拥塞控制机制。通过滑动窗口协议和拥塞控制算法来调整数据发送速率,以适应网络的拥塞情况。

UDP:不提供流量控制和拥塞控制。发送方以恒定的速率发送数据包,不考虑网络的拥塞情况。

传输速度

TCP:相对较慢。由于连接管理、错误检测和恢复等机制,TCP的传输速度受到一定影响。

UDP:相对较快。由于无需建立连接和进行确认操作,UDP的传输速度通常比TCP更快。

协议开销

TCP:协议开销较大。TCP数据包包含更多的头部信息,用于连接管理、确认和重传等机制。

UDP:协议开销较小。UDP数据包头部信息较少,只包含必要的源端口号、目的端口号、长度和校验和等信息。

 适用场景

TCP:适用于对数据传输可靠性要求较高的场景,如文件传输、电子邮件、Web浏览、远程登录等。

UDP:适用于对实时性要求较高、可以容忍一定数据丢失的场景,如实时音视频传输、在线视频会议、实时游戏等。
5.TCP协议使用

服务端:

import java.net.*;  
import java.io.*;  
  
public class TCPServer {  
    public static void main(String[] args) {  
        try {  
            // 创建服务器端的Socket对象,绑定监听端口  
            ServerSocket serverSocket = new ServerSocket(8888);  
            System.out.println("服务器启动,等待连接...");  
  
            // 等待客户端连接,连接后返回一个Socket对象  
            Socket socket = serverSocket.accept();  
            System.out.println("客户端已连接!");  
  
            // 创建输入流,读取客户端发送的数据  
            InputStream inputStream = socket.getInputStream();  
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));  
            String info = bufferedReader.readLine(); // 读取一行数据  
            System.out.println("收到客户端消息:" + info);  
  
            // 创建输出流,向客户端发送数据  
            OutputStream outputStream = socket.getOutputStream();  
            PrintWriter printWriter = new PrintWriter(outputStream, true);  
            printWriter.println("服务器响应:收到消息!");  
  
            // 关闭资源  
            printWriter.close();  
            bufferedReader.close();  
            socket.close();  
            serverSocket.close();  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
    }  
}

客户端:

import java.net.*;  
import java.io.*;  
  
public class TCPClient {  
    public static void main(String[] args) {  
        try {  
            // 创建客户端的Socket对象,指定服务器地址和端口号  
            Socket socket = new Socket("localhost", 8888);  
  
            // 创建输出流,向服务器发送数据  
            OutputStream outputStream = socket.getOutputStream();  
            PrintWriter printWriter = new PrintWriter(outputStream, true);  
            printWriter.println("你好,服务器!");  
  
            // 创建输入流,读取服务器发送的数据  
            InputStream inputStream = socket.getInputStream();  
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));  
            String response = bufferedReader.readLine(); // 读取一行数据  
            System.out.println("收到服务器响应:" + response);  
  
            // 关闭资源  
            printWriter.close();  
            bufferedReader.close();  
            socket.close();  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
    }  
}

1. 创建连接

  • 客户端:使用Socket类的构造方法创建一个Socket对象,该对象代表与服务器的一个连接。构造方法通常需要服务器的IP地址和端口号作为参数。例如:
    Socket socket = new Socket("serverIP", port);
  • 服务器端:使用ServerSocket类的构造方法创建一个ServerSocket对象,并绑定到一个指定的端口上。然后,调用accept()方法等待客户端的连接请求。例如:
    ServerSocket serverSocket = new ServerSocket(port); 
    Socket socket = serverSocket.accept();

2. 数据传输

  • 发送数据:在客户端和服务器端,都可以通过Socket对象获取输出流(OutputStream),然后将其包装成更方便的流类型(如PrintWriter),用于发送数据。例如:
    OutputStream outputStream = socket.getOutputStream();
     PrintWriter printWriter = new PrintWriter(outputStream, true); 
    printWriter.println("Hello, Server!");
  • 接收数据:同样,在客户端和服务器端,都可以通过Socket对象获取输入流(InputStream),然后将其包装成更方便的流类型(如BufferedReader),用于接收数据。例如:
    InputStream inputStream = socket.getInputStream();
     BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
     String line = bufferedReader.readLine();

3. 关闭连接

  • 完成数据传输后,需要关闭连接以释放资源。这可以通过调用Socket对象的close()方法来实现。例如:socket.close(); 如果服务器端还绑定了ServerSocket对象,则还需要关闭该对象。例如:
    serverSocket.close();

4. 异常处理

  • 在进行网络编程时,经常会遇到各种网络异常(如IOException)。因此,通常需要将网络操作放在try-catch块中,以便捕获并处理这些异常。

注意事项

  • 在进行TCP网络通信时,需要确保客户端和服务器端的端口号一致。
  • TCP是面向连接的协议,因此在发送和接收数据之前,必须先建立连接。
  • TCP协议保证了数据的可靠性和顺序性,因此在网络状况不佳的情况下,可能会出现数据传输延迟或重传的情况。
  • 在实际开发中,还需要考虑多线程或多进程并发处理多个客户端连接的情况,以及异常处理和资源释放等问题。

未完待续……

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

42.HOOK引擎核心代码

上一个内容:41.HOOK引擎设计原理 以 40.设计HOOK引擎的好处 它的代码为基础进行修改 主要做的是读写寄存器 效果图 添加一个类 htdHook.h文件中的实现 #pragma once class htdHook { public:htdHook(); };htdHook.cpp文件中的实现: #include "…

论文阅读:Simple and Efficient Heterogeneous Graph Neural Network

Yang, Xiaocheng, Mingyu Yan, Shirui Pan, Xiaochun Ye and Dongrui Fan. “Simple and Efficient Heterogeneous Graph Neural Network.” AAAI Conference on Artificial Intelligence (2022). 论文地址:[PDF] Simple and Efficient Heterogeneous Graph Neural…

centos7 xtrabackup mysql 基本测试(5)mysql 建立 测试 数据库及内容

centos7 xtrabackup mysql 基本测试(5)mysql 建立 测试 数据库及内容 登录 mysql -u etc -p 1234aA~1创建数据库 名字是company show databases ; create database company;在 company里面 创建表employee use company; DROP TABLE IF EXISTS employ…

Webpack: 构建 NPM Library

概述 虽然 Webpack 多数情况下被用于构建 Web 应用,但与 Rollup、Snowpack 等工具类似,Webpack 同样具有完备的构建 NPM 库的能力。与一般场景相比,构建 NPM 库时需要注意: 正确导出模块内容;不要将第三方包打包进产…

C : 线性规划例题求解

Submit Page TestData Time Limit: 1 Sec Memory Limit: 128 Mb Submitted: 93 Solved: 49 Description 求解下述线性规划模型的最优值min �1�1�2�2�3�3�.�. &…

Pbootcms留言“提交成功”的提示语怎么修改

我们在用到pbootcms建站时候,其中有个留言功能,提交成功后会提示:提交成功(如下图所示),那么我们要修改这个提示语要怎么操作呢? 如果需要修改的话,直接找到文件/apps/home/control…

完美世界|单机版合集(共22个版本)

前言 我是研究单机的老罗,今天给大家带来的是完美世界的单机版合集,一共22个版本。本人亲自测试了一个版本,运行视频如下: 完美世界|单机版合集 先看所有的版本的文件,文件比较大,准备好空间,差…

运行CDN

背景 CDN代码,调试运行 日常 git clone代码配置虚拟环境 puthon3.8,pip install r requirements.txt改项目数据集路径,在hico.py文件里面 # PATHS {# train: (root / images / train2015, root / annotations / trainval_hico.json),# val: …

捕获野生的登录页,暴改Vue3

1.实现效果 2.Vue组件 <script setup> import {onMounted} from "vue";onMounted(()>{// getAllData() }) </script><template><div class"login"><div class"form-cont"><div class"form-top"&…

音视频开发34 FFmpeg 编码- 将h264和acc文件打包成flv文件

FFmpeg合成流程 示例本程序会⽣成⼀个合成的⾳频和视频流&#xff0c;并将它们编码和封装输出到输出⽂件&#xff0c;输出格式是根据⽂件 扩展名⾃动猜测的。 示例的流程图如下所示。 ffmpeg 的 Mux 主要分为 三步操作&#xff1a; avformat_write_header &#xff1a; 写⽂…

ASP.Net.WebAPI和工具PostMan

1.WebAPI概述 1.1 WebAPI WebAPI 是一种传统的方式&#xff0c;用于构建和暴露 RESTUI风格的Web服务。它提供了丰富的功能和灵活性&#xff0c;可以处理各种HTTP请求&#xff0c;并支持各种数据格式&#xff0c;如JSON、XML等。 WebAPI使用控制器(Controllers)和动作方法(Ac…

25 防火墙基础操作

1 防火墙进入WEB页面操作 华三防火墙的默认用户:admin/密码:admin 将IP地址改在同一网段的信息 在防火墙的管理地址 GE/0/0/1&#xff1a;192.168.0.1 主机的地址是:192.168.0.101 思考一下为什么Ping不通 security-zone name Management import interface GigabitEthernet1/…

python、pytorch、cuda安装及常见pip命令

1、查看本地安装的CUDA版本 命令&#xff1a;nvidia-smi 2、安装CUDA 下载地址&#xff1a;https://developer.nvidia.com/cuda-toolkit-archive?spm5176.28103460.0.0.49e33da2H7ktW7 进入后选择指定版本进入详情页&#xff0c;选择linux和windows版本&#xff0c;下载然后…

Qt开发报错:Q_INTERFACES Error: Undefined interface

1、背景 VS2019qt5.12.10 从svn拉下来的项目&#xff0c;结果报错&#xff1a; Q_INTERFACES Error: Undefined interface 之前在VS的扩展中在线安装了qt插件&#xff0c; 安装了一半&#xff0c;比较慢&#xff0c;直接强行退出了。。 后来安装了qt官网的插件。。。。 2、报…

【计算机网络】HTTP——基于HTTP的功能追加协议(个人笔记)

学习日期&#xff1a;2024.6.29 内容摘要&#xff1a;基于HTTP的功能追加协议和HTTP/2.0 HTTP的瓶颈与各功能追加协议 需求的产生 在Facebook、推特、微博等平台&#xff0c;每分每秒都会有人更新内容&#xff0c;我们作为用户当然希望时刻都能收到最新的消息&#xff0c;为…

Keepalive技术

文章目录 一、Keepalive基础vrrp技术Keepalived介绍Keepalived架构 二、 Keepalived 相关文件配置文件组成全局配置虚拟路由器配置 三、配置lvs和keepalive联动服务器架构抢占模式配置配置单播、组播配置通知模块日志功能脑裂现象 四、keepalived和nginx联动keepalive和其他应用…

探索MySQL核心技术:理解索引和主键的关系

在数据密集型应用中&#xff0c;数据库的性能往往是决定一个应用成败的重要因素之一。其中&#xff0c;MySQL作为一种开源关系型数据库管理系统&#xff0c;以其卓越的性能和丰富的功能被广泛应用。而在MySQL数据库优化的众多技巧中&#xff0c;索引和主键扮演着极其重要的角色…

专题一: Spring生态初探

咱们先从整体脉络上看下Spring有哪些模块&#xff0c;重要的概念有个直观印象。 从Spring框架的整体架构和组成对整体框架有个认知。 Spring框架基础概念 Spring基础 - Spring和Spring框架组成 上图是从官网4.2.x获取的原图&#xff0c;目前我们使用最广法的版本应该都是5.x&am…

svn怎么新建分支,切换分支

在当前分支下&#xff0c;点svn右键&#xff0c;选择分支/标记 在选择远端地址时&#xff0c;点右边更多选项&#xff0c;打开远端版本库。找到对应的分支上级位置&#xff0c;点击确定 填写新分支名称&#xff0c;我这儿是将分支建在了branches下&#xff0c;分支名称为V1.1 填…

WEB攻防【4】——JavaWeb项目/JWT身份攻击/组件安全/访问控制

一、知识点 1、Javaweb常见安全及代码逻辑 Javaweb的架构&#xff1a; 如何通过包查找到文件&#xff0c;通过URL对应源码的文件&#xff0c;或者通过源码文件对应URL地址。 2、目录遍历&身份验证&逻辑&JWT Javaweb里面有身份认证的JWT的技术&#xff0c;pyth…