JAVA基础 - 网络编程

news2024/11/27 11:44:03

目录

一. 网络基础

BS(Browser/Server,浏览器/服务器架构)

CS(Client/Server,客户端/服务器架构)

二. TCP Socket通信

三. Socket类

四. 聊天实例

五. UDP Socket

六. 数据交换格式



一. 网络基础

网络是将不同地理位置的计算机和设备连接在一起,使它们能够相互通信和共享资源的系统。

网络的组成部分

  1. 节点:包括计算机、服务器、智能手机、路由器等设备。
  2. 通信链路:用于连接节点的物理介质,如双绞线、光纤、无线电波等。

网络的类型

  1. 局域网(LAN):覆盖较小的地理范围,如办公室、学校或家庭。
  2. 广域网(WAN):跨越较大的地理区域,通常由多个局域网通过公共网络连接而成。

网络协议
协议是网络中设备之间通信的规则和标准。常见的网络协议包括:

  1. TCP/IP(传输控制协议/网际协议):是互联网的基础协议簇,包括 IP、TCP、UDP 等。
    • IP 负责在网络中寻址和路由数据包。
    • TCP 提供可靠的、面向连接的数据传输服务。
    • UDP 提供不可靠的、无连接的数据传输服务。
  2. HTTP(超文本传输协议):用于在 Web 浏览器和服务器之间传输网页和相关数据。
  3. FTP(文件传输协议):用于在网络上传输文件。

IP 地址和域名

  1. IP 地址:是给网络上的设备分配的唯一标识符,如 192.168.1.1 。
  2. 域名:如 www.example.com ,更便于人类记忆,通过域名系统(DNS)解析为对应的 IP 地址。

网络拓扑结构
描述网络中设备的连接方式,常见的有总线型、星型、环型、树型和网状型。

例如,在一个公司的网络中,各个部门的计算机通过交换机组成局域网,这些局域网再通过路由器连接到互联网,员工可以通过网络访问公司内部的服务器获取资源,也可以通过浏览器访问外部网站,这都依赖于网络的各种组成部分、协议和拓扑结构的协同工作。

BS(Browser/Server,浏览器/服务器架构)

在 BS 架构中,客户端使用浏览器作为用户界面,服务器端负责处理业务逻辑和数据存储。用户通过浏览器向服务器发送请求,服务器处理请求后将结果返回给浏览器展示。

优点:

  • 部署和维护方便,只需更新服务器端。
  • 跨平台性好,用户通过各种支持浏览器的设备访问。
  • 成本相对较低,无需为每个客户端安装软件。

例如,常见的在线办公软件、电商平台大多采用 BS 架构。

CS(Client/Server,客户端/服务器架构)

CS 架构中,客户端和服务器端都承担一定的功能。客户端通常具有更丰富的用户界面和部分处理能力,服务器端主要负责数据管理和核心业务逻辑。

优点:

  • 响应速度快,部分处理在客户端完成。
  • 可离线使用,一些功能在客户端本地实现,不依赖网络。

例如,大型游戏、专业设计软件等常采用 CS 架构。

二. TCP Socket通信

TCP Socket 通信是一种基于 TCP 协议的网络编程接口,用于在不同的进程或计算机之间进行可靠的数据传输。

TCP 协议的特点

  • 面向连接:在通信之前,客户端和服务器端需要建立连接。
  • 可靠传输:通过确认、重传和拥塞控制等机制保证数据的无差错、按顺序到达。
  • 字节流服务:TCP 把应用程序交下来的数据看成一连串的无结构的字节流。

Socket 概念
Socket 是应用程序与网络协议栈之间的接口,它封装了通信的细节,使得开发者可以专注于应用逻辑。

TCP Socket 通信的工作流程

服务器端

  1. 创建 ServerSocket 对象,并指定监听的端口。
  2. 调用 accept() 方法阻塞等待客户端的连接请求。当有客户端连接时,返回一个新的 Socket 对象用于与该客户端通信。
  3. 通过这个新的 Socket 对象的输入输出流进行数据的接收和发送。

客户端

  1. 创建 Socket 对象,指定服务器的 IP 地址和端口。
  2. 连接服务器,如果连接成功,就可以通过该 Socket 对象的输入输出流与服务器进行数据交互。

数据传输
可以使用 InputStream 读取数据,使用 OutputStream 写入数据。数据可以是字节形式,也可以通过转换为字符或其他数据类型进行处理。

异常处理
在通信过程中,可能会出现各种异常,如连接失败、读写异常等,需要进行适当的捕获和处理。

关闭连接
通信完成后,需要关闭 Socket 、输入输出流等资源,以释放系统资源。

应用场景

  • 即时通讯应用:如聊天软件。
  • 文件传输:保证文件数据的完整和正确传输。
  • 分布式系统中的节点通信:实现不同节点之间的协调和数据交换。

例如,一个在线文件下载服务,服务器端等待客户端的连接请求,客户端连接后发送文件请求,服务器端读取文件并通过 TCP 连接将数据发送给客户端。

总之,TCP Socket 通信是一种强大而灵活的网络通信方式,为各种网络应用提供了可靠的数据传输基础。但在实际开发中,需要仔细处理各种情况,以确保通信的稳定性和正确性。

三. Socket类

在 Java 中,Socket 类用于实现客户端与服务器之间的网络通信。

构造方法

  • Socket(String host, int port) :创建一个连接到指定主机和端口的套接字。
  • Socket(InetAddress address, int port) :使用指定的 IP 地址和端口创建套接字。

常用方法

  • getInputStream() :返回此套接字的输入流,用于读取服务器发送的数据。
  • getOutputStream() :返回此套接字的输出流,用于向服务器发送数据。
  • getInetAddress() :获取连接的远程主机的 IP 地址。
  • getPort() :获取连接的远程端口。
  • close() :关闭套接字,释放相关资源。

示例代码(客户端)

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

public class SocketClientExample {
    public static void main(String[] args) {
        try (Socket socket = new Socket("127.0.0.1", 8080)) {  // 连接本地主机的 8080 端口
            OutputStream outputStream = socket.getOutputStream();
            String message = "Hello, Server!";
            outputStream.write(message.getBytes());

            InputStream inputStream = socket.getInputStream();
            byte[] buffer = new byte[1024];
            int bytesRead = inputStream.read(buffer);
            String response = new String(buffer, 0, bytesRead);
            System.out.println("Server response: " + response);

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

在上述示例中,创建了一个到指定地址和端口的 Socket 对象,然后向服务器发送数据,并接收服务器的响应。

注意事项

  • 在使用完 Socket 后,一定要调用 close() 方法关闭,以释放资源。
  • 网络通信可能会出现各种异常,如连接超时、IO 异常等,需要进行适当的异常处理。

Socket 类为 Java 中的网络编程提供了基础,使得开发基于 TCP 协议的客户端应用变得相对简单和直观。

四. 聊天实例

服务端代码:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class ChatServer {
    public static void main(String[] args) {
        try (ServerSocket serverSocket = new ServerSocket(8888)) {
            System.out.println("服务器启动,等待客户端连接...");

            Socket socket = serverSocket.accept();
            System.out.println("客户端已连接");

            // 输入输出流
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            PrintWriter out = new PrintWriter(socket.getOutputStream(), true);

            String message;
            while ((message = in.readLine())!= null) {
                System.out.println("客户端: " + message);
                out.println("服务器: 已收到你的消息 - " + message);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

客户端代码:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class ChatClient {
    public static void main(String[] args) {
        try (Socket socket = new Socket("127.0.0.1", 8888)) {
            // 输入输出流
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            PrintWriter out = new PrintWriter(socket.getOutputStream(), true);

            BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in));
            String message;
            while ((message = consoleReader.readLine())!= null) {
                out.println(message);
                System.out.println("服务器: " + in.readLine());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

在上述代码中,服务端监听 8888 端口,等待客户端连接。客户端连接到本地的 8888 端口,并与服务端进行交互。用户在客户端输入消息,服务端接收并回复,实现简单的聊天功能。

五. UDP Socket

在 Java 中,DatagramSocket 类用于实现用户数据报协议(UDP)的网络通信。

构造方法

  • DatagramSocket() :创建一个绑定到本地主机随机可用端口的 DatagramSocket 对象。
  • DatagramSocket(int port) :创建一个绑定到指定本地端口的 DatagramSocket 对象。
  • DatagramSocket(int port, InetAddress laddr) :创建一个绑定到指定本地地址和端口的 DatagramSocket 对象。

常用方法

  • send(DatagramPacket p) :发送数据报。
  • receive(DatagramPacket p) :接收数据报。
  • close() :关闭套接字。

DatagramPacket 类
用于封装要发送或接收的数据报。

构造方法:

  • DatagramPacket(byte[] buf, int length) :用于接收数据报。
  • DatagramPacket(byte[] buf, int length, InetAddress address, int port) :用于发送数据报。

示例代码(发送端)

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class UDPSender {
    public static void main(String[] args) {
        try (DatagramSocket socket = new DatagramSocket()) {
            String message = "Hello, UDP!";
            byte[] data = message.getBytes();

            InetAddress address = InetAddress.getByName("127.0.0.1");
            DatagramPacket packet = new DatagramPacket(data, data.length, address, 8888);

            socket.send(packet);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

示例代码(接收端)

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class UDPReceiver {
    public static void main(String[] args) {
        try (DatagramSocket socket = new DatagramSocket(8888)) {
            byte[] buffer = new byte[1024];
            DatagramPacket packet = new DatagramPacket(buffer, buffer.length);

            socket.receive(packet);

            String receivedMessage = new String(packet.getData(), 0, packet.getLength());
            System.out.println("Received: " + receivedMessage);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

UDP 的特点

  • 无连接:不需要在发送数据之前建立连接。
  • 不可靠:不保证数据报的顺序、不重复和不丢失。
  • 高效:开销小,适用于实时性要求较高、对数据准确性要求相对较低的场景。

总之,UDP Socket 提供了一种快速但相对简单和不可靠的数据传输方式,在某些特定的应用中具有优势。

六. 数据交换格式

数据交换格式是用于在不同系统、应用程序或网络之间传输和共享数据的特定结构和规则。

常见的数据交换格式包括:

  1. JSON(JavaScript Object Notation)

    • 特点:轻量级、易于阅读和编写、易于机器解析和生成。
    • 示例:{"name": "John", "age": 30, "city": "New York"}
    • 广泛应用于 Web 应用的前后端数据交互、配置文件等。
  2. XML(eXtensible Markup Language)

    • 特点:具有良好的自描述性、格式规范、可扩展性强。
    • 示例:<person><name>John</name><age>30</age><city>New York</city></person>
    • 常用于数据存储、配置文件、Web 服务等。
  3. CSV(Comma-Separated Values)

    • 特点:简单、以逗号分隔值,适合表格数据。
    • 示例:name,age,city\nJohn,30,New York
    • 常用于数据导出、导入,电子表格处理。
  4. YAML(YAML Ain't Markup Language)

    • 特点:简洁、易读,对缩进敏感。
    • 示例:
    name: John
    age: 30
    city: New York
  • 常用于配置文件。
  1. Protobuf(Protocol Buffers)
    • 特点:高效的二进制格式、跨语言支持好、数据压缩率高。
    • 需要先定义 .proto 文件来描述数据结构。

例如,在一个电商网站中,商品信息可能以 JSON 格式从后端服务器发送到前端页面进行展示;而在数据备份时,可能会将用户数据以 CSV 格式导出。

选择数据交换格式时,需要考虑数据的复杂性、可读性、传输效率、跨语言支持等因素。

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

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

相关文章

力反馈设备在远程机器人遥操作中的应用实例

随着科技的飞速发展&#xff0c;力反馈设备在远程机器人遥操作中的应用日益广泛&#xff0c;极大地提升了操作的精确性和安全性。其中&#xff0c;Haption Virtuose 6D力反馈设备以其卓越的性能成为该领域的佼佼者。 Haption Virtuose 6D力反馈设备医疗遥操作应用 在医疗领域&a…

公布一批脸书爬虫(facebook)IP地址,真实采集数据

一、数据来源&#xff1a; 1、这批脸书爬虫&#xff08;facebook&#xff09;IP来源于尚贤达猎头公司网站采集数据&#xff1b; ​ 2、数据采集时间段&#xff1a;2023年10月-2024年7月&#xff1b; 3、判断标准&#xff1a;主要根据用户代理是否包含“facebook”和IP核实。…

谷粒商城实战笔记-92~96-商品发布和查询

文章目录 Spu列表检索接口。Sku列表检索接口。仓库列表接口。问题记录 这一篇包含如下内容&#xff1a; 92-商品服务-API-新增商品-商品保存其他问题处理93-商品服务-API-商品管理-SPU检索94-商品服务-API-商品管理-SKU检索95-仓储服务-API-仓库管理-整合ware服务&获取仓库…

【云原生】Kubernetes中的定时任务CronJob的详细用法与企业级应用案例分享

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

皮尔逊(Person)相关系数

目录 一、总体和样本 二、总体皮尔逊相关系数 三、样本皮尔逊相关系数 四、皮尔逊相关系数的理解误区 五、总结 六、相关系数大小的解释&#xff08;并不严格&#xff09; 七、皮尔逊相关系数的计算 一、总体和样本 二、总体皮尔逊相关系数 三、样本皮尔逊相关系数 四、…

Java并发之ThreadLocal

1. 简介 ThreadLocal是 Java 中提供的一种用于实现线程局部变量的工具类。它允许每个线程都拥有自己的独立副本&#xff0c;从而实现线程隔离&#xff0c;用于解决多线程中共享对象的线程安全问题。 通常&#xff0c;我们会使用 synchronzed 关键字 或者 lock 来控制线程对临…

iPhone 手机如何查看自己的电话号码?这两种方法都可以

设置应用程序查看 第一种查看自己的电话号码的方法是在设置应用程序中的电话选项中查看当前手机的电话号码&#xff0c;下面是具体的操作步骤&#xff1a; 首先我们先打开设置应用程序&#xff0c;然后往下滑动找到电话选项&#xff0c;点击进入。 然后就可以看见界面中有“本…

【100个深度学习实战项目】目标检测、语义分割、目标追踪、图像分类等应有尽有,持续更新~~~

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 引言 本文主要介绍深度学习在各…

智能城市管理系统设计思路详解:集成InfluxDB、Grafana和MQTTx协议(代码示例)

引言 随着城市化进程的加快&#xff0c;城市管理面临越来越多的挑战。智能城市管理系统的出现&#xff0c;为城市的基础设施管理、资源优化和数据分析提供了现代化的解决方案。本文将详细介绍一个基于开源技术的智能城市管理系统&#xff0c;涵盖系统功能、技术实现、环境搭建…

【扒模块】DFF

图 医学图像分割任务 代码 import torch import torch.nn as nnfrom timm.models.layers import DropPath # 论文&#xff1a;D-Net&#xff1a;具有动态特征融合的动态大核&#xff0c;用于体积医学图像分割&#xff08;3D图像任务&#xff09; # https://arxiv.org/abs/2403…

[C#]基于wpf实现的一百多种音色的Midi键盘软件

键盘 音色库 源码地址&#xff1a;https://download.csdn.net/download/FL1623863129/89599322

前端必知必会-html表单的基本使用

文章目录 HTML 表单<form> 元素<input> 元素文本字段<label> 元素单选按钮复选框提交按钮<input> 的 Name 属性总结 HTML 表单 HTML 表单用于收集用户输入。用户输入通常发送到服务器进行处理。 <form> 元素 HTML <form> 元素用于创建 H…

无人机环保行业解决方案-河道自动巡检

搭配大疆机场&#xff0c;智能化巡检 轻量一体化设计 相较于其他市面产品&#xff0c;大疆机场更加小巧&#xff0c;占地面积不足1平方米。 展开状态&#xff1a;长1675 mm&#xff0c;宽895 mm&#xff0c;高530mm&#xff08;不含气象站&#xff09; 闭合状态&#xff1a;…

C++之引用(详解,引用与指针的区别)

目录 1. 引⽤的概念和定义 2. 引⽤的特性 3. 引⽤的使⽤ 4. const引⽤ 5. 指针和引⽤的关系 1. 引⽤的概念和定义 引⽤不是新定义⼀个变量&#xff0c;⽽是给已存在变量取了⼀个别名(相当于是给变量起了个外号)&#xff0c;编译器不会为引⽤变量开辟内存空间&#xff0c;它…

冷月大佬的EVA-GAN: 可扩展的音频生成GAN结构-论文阅读笔记

前言&#xff1a; 最近在调研asr和tts相关的内容&#xff0c;准备开始学习相关的经典工作&#xff0c;为了倒逼自己学进脑子&#xff0c;我尝试将这些看到的一些好的学习笔记分享出来。 萌新学徒&#xff0c;欢迎相关领域的朋友推荐学习路径和经典工作&#xff01;拜谢&#x…

idea 配置 Tomcat

一、状态栏找到 “ Preferences ” 二、 搜索栏输入“application”——>“Application Servers”——>“”号 三、 点击“Tomcat Sever” 四、 选择电脑中Tomcat所在位置——>OK 五、状态栏——>Run——>Edit Configurations 六、 点击&#xff1a;“ ”号 七…

对称密码体制的工作模式及标准解析

目录 1. 对称加密 2. 分组密码工作模式 2.1 ECB 2.2 CBC 2.3 CFB 2.4 OFB 2.5 CTR ​​​​​​​2.6 XTS 3. DES/3DES ​​​​​​​4. AES ​​​​​​​5. SM4 1. 对称加密 对称加密是一种发送方和接收方都使用相同密钥对数据进行加解密的方法。它只提供保密性…

Django的响应对象

【图书介绍】《Django 5企业级Web应用开发实战&#xff08;视频教学版&#xff09;》_django 5企业级web应用开发实战(视频教学版)-CSDN博客 《Django 5企业级Web应用开发实战&#xff08;视频教学版&#xff09;》(王金柱)【摘要 书评 试读】- 京东图书 (jd.com) Django的请…

支持向量机和梯度提升决策树

支持向量机&#xff08;SVM, Support Vector Machine&#xff09; 原理 支持向量机是一种监督学习模型&#xff0c;适用于分类和回归任务。SVM 的目标是找到一个能够最大化类别间间隔的超平面&#xff0c;以便更好地对数据进行分类。对于非线性数据&#xff0c;SVM 通过核技巧…

C语言程序设计17

程序设计17 问题17_1代码17_1结果17_1 问题17_2代码17_2结果17_2 问题17_3代码17_3结果17_3 问题17_1 下列给定程序的功能是 &#xff1a;调用函数 f u n fun fun 将指定源文件中的内容复制到指定的目标文件中&#xff0c;复制成功时函数返回 1 1 1 &#xff0c;失败时返回 …