Java基础--网络编程

在Java开发中,常见的通信协议有多种,这些协议在不同的应用场景中发挥着各自的优势。

通信协议

1. HTTP/HTTPS

  • HTTP(HyperText Transfer Protocol):是最常用的网络协议之一,用于分布式、协作式、超媒体信息系统。它支持请求/响应模型,具有灵活的头部和方法(如GET、POST、PUT、DELETE等)。HTTP是无状态协议,每个请求都是独立的。
  • HTTPS:是HTTP的安全版本,通过SSL/TLS提供加密传输,用于保护数据传输的安全性。HTTPS提供了数据加密、完整性校验和身份验证。

2. TCP/IP

  • TCP(Transmission Control Protocol):是面向连接的通信协议,提供可靠的、有序的和错误检查的数据传输。TCP协议在传输数据之前,会在发送端和接收端建立逻辑连接。
  • IP(Internet Protocol):负责数据包的寻址和路由。TCP/IP协议是互联网的基础协议,用于不同网络之间的通信。

3. WebSocket

  • WebSocket是一种网络通讯协议,提供了在单个TCP连接上进行全双工通讯的能力。它支持实时双向通讯,适用于需要即时通讯的应用,如聊天应用、在线游戏等。WebSocket可以在HTTP/HTTPS端口上工作,易于通过防火墙。

4. gRPC

  • gRPC是一个高性能、开源和通用的RPC(远程过程调用)框架,由Google主导开发。它使用Protocol Buffers作为接口定义语言,支持多种语言,包括Java。gRPC提供了流控制、头部压缩等特性,适用于构建分布式系统和微服务,以及跨语言的服务间调用。

5. MQTT

  • MQTT(Message Queuing Telemetry Transport)是一种轻量级的发布/订阅消息传输协议,特别适用于低带宽、高延迟或不可靠的网络。它基于TCP/IP协议,支持QoS(Quality of Service)等级,确保消息的可靠传输。MQTT适用于物联网(IoT)应用,如智能家居、远程监控等。

6. AMQP

  • AMQP(Advanced Message Queuing Protocol)是一个提供高度可靠的异步消息传输的网络协议。它支持多种消息传递模式,包括点对点和发布/订阅。AMQP提供了消息确认和持久化机制,适用于企业级消息队列系统,如RabbitMQ。它支持多种语言和平台,需要高可靠性和灵活的消息路由的场景。

7. CoAP

  • CoAP(Constrained Application Protocol)是一种专为物联网环境设计的网络协议,适用于资源受限的设备。它基于UDP,减少了开销,支持资源标识和请求/响应模型。CoAP提供了简单的发现和观察机制,适用于物联网设备之间的通信,以及需要简单、高效的消息传输的场景。

8. UDP

  • UDP(User Datagram Protocol)是一种无连接的通信协议,在数据传输时,数据的发送端和接收端不建立逻辑连接。UDP具有通信效率高的优点,但无法保证数据的完整性。因此,它通常用于对数据传输速度要求较高但对数据完整性要求不高的场景,如音频、视频和普通数据的传输。

WebSocket

WebSocket是一种网络通信协议,它提供了在单个TCP连接上进行全双工通信的能力。

概述

WebSocket通过一次HTTP请求进行初始化,然后服务器和客户端之间就可以建立一个持久的连接,通过这个连接双方可以实时地发送和接收数据,而不需要像传统的HTTP请求那样每次都需要建立新的连接。这种特性使得WebSocket非常适合需要实时通信的应用场景,如在线聊天、实时数据更新、游戏等。

WebSocket的特点

  1. 双向通信:WebSocket支持双向通信,即服务器可以主动向客户端推送数据,客户端也可以主动向服务器发送数据。
  2. 持久连接:WebSocket连接一旦建立,就会保持一个持久的连接状态,直到一方主动断开连接。
  3. 实时性:由于WebSocket连接是持久的,所以服务器可以实时地向客户端推送数据,而不需要客户端主动发起请求。
  4. 数据格式轻量:WebSocket的数据格式比较轻量,性能开销小,通信高效。
  5. 跨平台支持:WebSocket协议可以在多种平台上使用,包括桌面应用、移动应用和Web应用。

WebSocket的工作原理

  1. 握手阶段:WebSocket的握手阶段采用HTTP协议进行通信。客户端向服务器发送一个带有特殊头信息的HTTP请求,请求中包含了WebSocket协议的相关参数。服务器接收到请求后,会进行一系列的验证和检查,如果验证通过,就会返回一个特殊的HTTP响应,表示WebSocket连接建立成功。
  2. 数据传输阶段:一旦WebSocket连接建立成功,客户端和服务器之间就可以开始传输数据了。数据传输是通过TCP连接进行的,数据格式可以是文本也可以是二进制数据。在传输过程中,双方会按照WebSocket协议的规定对数据进行封装和解封装。

WebSocket的应用场景

  1. 实时聊天:WebSocket可以用于实现即时通讯,如在线聊天室、多人游戏等。通过WebSocket,客户端和服务器可以实时地发送和接收消息,而不需要频繁地发起HTTP请求。
  2. 实时数据更新:WebSocket可以用于实时地推送数据更新,如实时股票行情、实时天气预报等。服务器可以实时地将最新的数据推送给客户端,客户端无需主动发起请求。
  3. 协同编辑:WebSocket可以用于实现多人协同编辑,如在线文档协作、团队代码编辑等。多个用户可以同时编辑同一个文档或代码文件,他们的编辑结果会实时地同步到其他用户的界面上。
  4. 实时监控:WebSocket可以用于实时监控系统,如监控设备的运行状态、实时监测交通流量等。服务器可以实时地将监控数据推送给客户端,客户端可以及时地显示最新的监控信息。

WebSocket的优缺点

  1. 优点

    • 实时性:WebSocket能够实时地双向通信,服务器可以主动推送数据到客户端,而不需要客户端发送请求。
    • 减少网络流量:相比于传统的HTTP请求响应模式,WebSocket连接只需要进行一次握手,之后就可以保持长连接,减少了网络流量和延迟。
    • 较少的开销:WebSocket使用较少的开销来维持连接,因为在连接建立后,客户端和服务器之间的通信只需要少量的头信息。
  2. 缺点

    • 服务器资源占用:由于WebSocket的长连接特性,服务器需要维护大量的连接,这可能会占用较多的服务器资源。
    • 安全性问题:WebSocket连接需要特殊的安全设置,以防止恶意攻击和数据泄漏。
    • 兼容性问题:虽然现代浏览器大多支持WebSocket协议,但在一些旧版本的浏览器上可能不被支持,需要通过polyfill或其他技术手段来解决兼容性问题。

Socket 类的方法

  1. 构造方法
    • Socket(String host, int port): 尝试连接到指定主机上的指定端口号。如果连接成功,则创建了一个新的Socket实例。
    • Socket(InetAddress address, int port): 尝试连接到指定IP地址(InetAddress对象)上的指定端口号。
    • Socket(String host, int port, InetAddress localAddr, int localPort): 尝试连接到指定主机上的指定端口号,同时绑定到本地的指定IP地址和端口号(这通常用于多网卡环境,指定使用哪个网卡进行通信)。
    • Socket(InetAddress address, int port, InetAddress localAddr, int localPort): 与上一个构造方法类似,但使用InetAddress对象指定远程和本地地址。
  2. 获取输入输出流
    • InputStream getInputStream(): 返回此套接字的输入流。可以从这个输入流中读取数据,这些数据是从连接的另一端发送过来的。
    • OutputStream getOutputStream(): 返回此套接字的输出流。可以向这个输出流中写入数据,这些数据将被发送到连接的另一端。
  3. 获取套接字信息
    • InetAddress getInetAddress(): 返回套接字连接的地址(远程主机的IP地址)。
    • int getPort(): 返回套接字连接的远程端口号。
    • InetAddress getLocalAddress(): 返回套接字绑定到的本地地址(如果套接字未绑定,则返回null)。
    • int getLocalPort(): 返回套接字绑定到的本地端口号。
  4. 控制套接字
    • void setTcpNoDelay(boolean on): 启用/禁用TCP_NODELAY选项(Nagle算法)。如果设置为true,则禁用Nagle算法,数据将立即发送,而不是等待缓冲区填满。
    • boolean getTcpNoDelay(): 返回TCP_NODELAY选项的状态。
    • void setKeepAlive(boolean on): 启用/禁用SO_KEEPALIVE选项。如果设置为true,则当连接空闲一段时间后,将发送保活数据包。
    • boolean getKeepAlive(): 返回SO_KEEPALIVE选项的状态。
    • void setSoLinger(int linger): 设置SO_LINGER选项,以控制套接字关闭时的行为。如果linger为0,则关闭套接字时立即丢弃未发送的数据;如果linger为正数,则尝试发送未发送的数据,最多等待指定的秒数;如果linger为-1,则使用系统默认行为。
    • int getSoLinger(): 返回SO_LINGER选项的值。
    • void setSoTimeout(int timeout): 设置套接字的超时时间(以毫秒为单位)。在读取数据时,如果指定时间内没有数据可读,则抛出SocketTimeoutException
    • int getSoTimeout(): 返回套接字的超时时间。
    • void setReuseAddress(boolean on): 启用/禁用SO_REUSEADDR选项。如果设置为true,则允许在TIME_WAIT状态下的套接字地址被重用。
    • boolean getReuseAddress(): 返回SO_REUSEADDR选项的状态。
    • void shutdownInput(): 关闭套接字的输入流。在关闭后,任何对该输入流的读操作都将抛出IOException
    • void shutdownOutput(): 关闭套接字的输出流。在关闭后,任何对该输出流的写操作都将抛出IOException。注意,这并不会关闭套接字本身,只是关闭了输出流。
  5. 其他方法
    • void connect(SocketAddress endpoint): 将此套接字连接到服务器。这通常用于无连接的套接字类型(如数据报套接字),但在Socket类中也可以调用(尽管它通常是在构造方法中完成的)。
    • void connect(SocketAddress endpoint, int timeout): 在指定的超时时间内将此套接字连接到服务器。
    • void bind(SocketAddress local): 将套接字绑定到本地地址。这通常用于服务器套接字,但在某些情况下,客户端套接字也可能需要绑定到特定的本地地址和端口。
    • boolean isConnected(): 返回套接字的连接状态。
    • boolean isBound(): 返回套接字是否已绑定到某个地址。
    • void close(): 关闭套接字并释放所有与之关联的资源。

使用Java Socket 类进行简单客户端网络通信的代码实例。

服务器代码(EchoServer.java)

import java.io.*;
import java.net.*;public class EchoServer {private static final int PORT = 12345;public static void main(String[] args) {try (ServerSocket serverSocket = new ServerSocket(PORT)) {System.out.println("Server is listening on port " + PORT);while (true) {try (Socket clientSocket = serverSocket.accept();BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true)) {System.out.println("New client connected");String inputLine;while ((inputLine = in.readLine()) != null) {System.out.println("Received: " + inputLine);out.println("Echo: " + inputLine);}} catch (IOException e) {System.err.println("Error handling client: " + e.getMessage());}}} catch (IOException e) {System.err.println("Could not listen on port " + PORT);System.exit(-1);}}
}

客户端代码(EchoClient.java)

import java.io.*;
import java.net.*;public class EchoClient {private static final String SERVER_ADDRESS = "localhost";private static final int SERVER_PORT = 12345;public static void main(String[] args) {try (Socket socket = new Socket(SERVER_ADDRESS, SERVER_PORT);PrintWriter out = new PrintWriter(socket.getOutputStream(), true);BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()))) {System.out.println("Connected to server");BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));String userInput;while ((userInput = stdIn.readLine()) != null) {out.println(userInput);System.out.println("Server response: " + in.readLine());// Exit if the user inputs "exit"if (userInput.equalsIgnoreCase("exit")) {break;}}} catch (UnknownHostException e) {System.err.println("Unknown host: " + e.getMessage());} catch (IOException e) {System.err.println("I/O error: " + e.getMessage());}}
}

运行步骤

  • 编译代码

    使用javac命令编译服务器和客户端代码。

javac EchoServer.java EchoClient.java
  • 运行服务器
    在一个终端窗口中运行服务器。

java EchoServer

服务器将开始监听端口12345上的连接。

  • 运行客户端

    在另一个终端窗口中运行客户端。

java EchoClient

 客户端将连接到服务器,并允许您输入文本。每次您输入一行文本并按回车键时,客户端都会将该文本发送到服务器,服务器将回显该文本,然后客户端将打印出服务器的响应。

  • 测试通信

    在客户端窗口中输入一些文本,并观察服务器窗口中的输出。您应该能够看到服务器接收并回显了您输入的文本。

  • 退出

    要在客户端退出程序,请输入exit并按回车键。这将关闭客户端套接字,并终止程序。

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

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

相关文章

Stylus 浏览器扩展开发-Cursor AI辅助

项目起源 作为一个经常需要长时间盯着屏幕的开发者,我一直在寻找一个简单的方法来保护眼睛。最初的想法很简单:将网页背景色替换成护眼的豆沙绿。虽然市面上已经有类似的扩展,但我想要一个更加轻量且可定制的解决方案。 这个简单的需求逐渐…

AD20 原理图库和PCB库添加

一 点击右下角 二 点击Components 三 点击File-based Libraries Preferences 四 最后点击安装即可

微信小程序uni-app+vue3实现局部上下拉刷新和scroll-view动态高度计算

微信小程序uni-appvue3实现局部上下拉刷新和scroll-view动态高度计算 前言 在uni-appvue3项目开发中,经常需要实现列表的局部上下拉刷新功能。由于网上相关教程较少且比较零散,本文将详细介绍如何使用scroll-view组件实现这一功能,包括动态高度计算、下拉刷新、上拉加载等完整…

针对边缘计算优化LoRa的TinyML信道跳变管道

论文标题:Optimizing LoRa for Edge Computing with TinyML Pipeline for Channel Hopping(针对边缘计算优化LoRa的TinyML信道跳变管道) 作者信息:Marla Grunewald, Mounir Bensalem 和 Admela Jukan,来自德国布伦瑞克…

Linux-USB驱动实验

USB 是很常用的接口,目前大多数的设备都是 USB 接口的,比如鼠标、键盘、USB 摄像头等,我们在实际开发中也常常遇到 USB 接口的设备,本章我们就来学习一下如何使能 Linux内核自带的 USB 驱动。注意!本章并不讲解具体的 …

操作系统文件管理相关习题2

文件管理的任务和功能文件管理 任务:对用户文件和系统文件进行组织管理,以方便用户使用,并保证文件的安全 功能:文件存储空间的管理,目录管理,文件读写管理和保护 目录管理 对目录管理的要求 实现按名存…

MYSQL - 索引详解

一 什么是索引? 实际上在上一篇介绍MYSQL的体系结构当中我们稍微提及了一点,在引擎层,我们提到不同的引擎对应的索引的实现方式,选择是不一样的。 简单理解,索引(index)其实就是一种帮助MYSQL高…

AI智能体Prompt预设词指令大全+GPTs应用使用

AI智能体使用指南 直接复制在AI工具助手中使用(提问前) 可前往SparkAi系统用户官网进行直接使用 SparkAI系统介绍文档:Docs 常见AI智能体GPTs应用大全在线使用 自定义添加制作AI智能体进行使用: 文章润色器 你是一位具有敏锐洞察…

el-tree树形结构拖拽层级错乱问题

背景: 项目中有个文件夹树形菜单,并且各级菜单中的子级元素是可以任意拖拽的,也就是树形结构拖拽修改分组。 问题分析: 出现拖拽层级错乱的问题,这通常意味着在进行节点拖拽操作后,树的层级关系没有正确地被维护。这可能是因为在更新节点位…

线程和进程(juc)

线程 一:概念辨析 1:线程与进程 进程: 1:程序由指令和数据组成,指令要执行,数据要读写,就需要将指令加载给cpu,把数据加载到内存,同时程序运行时还会使用磁盘&#x…

Java基础集合(Map)

存储特点 以键值对的形式存储, 一个元素由两个值组成 键(K-key): 无序, 无下标, 元素不可重复 值(V-value): 无序, 无下标, 元素可以重复 常用实现类 HashMap JDK1.2 底层哈希表实现 线程不安全, 效率高 LinkedHashMap JDK1.2 是HashMap的子类, 底层哈希表实现 线程不安全…

NEXT开发应用质量建议与测试指南

随着鸿蒙原生开发如火如荼的进展,NEXT对应用的质量提出了更高的要求。 NEXT的应用质量分为2个部分内容: ⚫ 体验质量: 功能数据完备、基础体验、HarmonyOS特征增强体验 ⚫ 内容合规: 资质、内容、广告、付费、开发者行为等 单元测…

java应用cpu占用过高故障排除

首先一定要清楚:java应用造成cpu过高的主要原因 1:一般是线程一直处于可运行(Runnable)状态,通常这些线程在执行无阻塞操作、循环、正则或纯粹的计算等任务 2:另一个可能造成CPU高的原因是频繁GC&#xff…

CPU是如何执行任务的?

你清楚下面这几个问题吗? 有了内存,为什么还需要 CPU Cache? CPU 是怎么读写数据的? 如何让 CPU 能读取数据更快一些? CPU 伪共享是如何发生的?又该如何避免? CPU 是如何调度任务的&#x…

最短路径算法(Dijkstra算法 + Bellman-Ford 算法 + Floyd-Warshall算法)

最短路径算法 完整版万字原文见史上最全详解图数据结构 1. Dijkstra算法(单源最短路径)(无负权边图) 算法原理 1. Dijkstra 算法通过 贪心策略 计算从一个源顶点到其他所有 顶点的最短路径。2. 时间复杂度为 O(V^2)&#xff08…

pyqt6事件概要

例子: 利用qtdesigner建立闹钟 python代码 # 导入所需要的文件 from PyQt6.QtGui import QIcon, QPixmap from PyQt6.QtWidgets import QApplication, QMainWindow, QPushButton, QListWidgetItem from PyQt6 import uic from PyQt6.QtCore import Qt, QTime imp…

位运算符I^~

&运算:上下相等才是1,有一个不同就是0 |运算:只要有1返回的就是1 ^(亦或)运算:上下不同是1,相同是0 ~运算:非运算,与数据全相反 cpu核心运算原理,四种cpu底层小电路 例&#xf…

【求助】Tinymce组件异常

版本号 { "tinymce/tinymce-vue": "^3.0.1", "tinymce": "^5.10.9", "vue": "^2.6.10", }问题: 就是红框处点击后没有菜单出现,下面是正常的

大模型分布式训练框架——DeepSpeed

本文的主要内容是阐述DeepSpeed训练模块在跟进大模型技术中的作用,重点解析了RLHF在其中的应用。文中深入探讨了模型训练的关键概念,如显存需求、优化器迭代和混合精度训练。针对大规模模型训练,介绍了模型并行和流水线并行等分布式训练方法&…

跟着AI 学 AI, 开发一个ChatBot, 完整图文版__持续更新中

跟着AI 学 AI, 开发一个ChatBot, 完整图文版__持续更新中.记录步骤以便排查错误。 使用Python 加 Visual Studio Code,开发代码。 使用Flask 套件和 ngrok 工具。 Step 1 下载安装Python ,下载完后 在CMD 测试 Python --version. 结果出现p…