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.mzph.cn/bicheng/63305.shtml

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

相关文章

Lua面向对象 实现 超详细注释 实现构造函数,析构函数,只读类模板等功能

Lua面向对象 实现 超详细注释 实现构造函数,析构函数,只读类模板等功能 源码 -- 注意下面的代码可以拆开成多个文件使用,也可以放一起 -- Class.lualocal _class {}-- 将Source变成只读表并返回 function MakeTableReadOnly(Source)local …

详细解读AEO海关认证

AEO认证,即“Authorized Economic Operator”认证,译为“经认证的经营者”认证,也被称作“综合认证优秀企业”认证。以下是对AEO海关认证的详细解读: 一、背景与意义 背景:AEO制度是世界海关组织(WCO&…

线性回归方程模型

一、项目要求 以个人为单位,实现AI识别的算法: 调查某市出租车使用年限和该年支出维修费用(万元),得到数据如下: 使用年限(x) 2 3 4 5 6 维修费用(y) 2.2 3.8 5.5 6.5 7.0 求线性回归方程由1中结论预测第10年所支出的维修费用 3.说明自己选中预测的原因和过程中的收获 说…

【OpenDRIVE_Python】使用python脚本读取txt指定内容,输出OpenDRIVE数据中对应的信息

示例代码说明: 读取txt指定内容如地物id,输出OpenDRIVE数据中的对应地物id和名称name信息为xml文件 import xml.dom.minidom from xml.dom.minidom import parse from xml.dom import Node import sys import os # 读取OpenDRIVE文件路径 xml_filepath…

什么是DBD设备?

2022年10月,本号文章《北斗优先是对北斗三代的挑衅》中指出:“多系统兼容互操作是北斗三号逐步替代北斗二号的主要原因。北斗优先是对北斗三代的挑衅。”现在想来,当时还是太年轻,格局没有打开。 2023年12月,本号文章…

vscode 折叠范围快捷键

vscode 折叠范围快捷键 问答 原文网址:https://www.n.cn/search/c830b29cb76146d08cae5074acfd4785 VSCode 折叠范围快捷键 在使用Visual Studio Code(VSCode)进行代码编辑时,掌握一些快捷键可以大大提高工作效率。以下是关于VSCode中折叠和…

uviewplus中的时间单选框up-datetime-picker的在uni-app+vue3的使用方法

uviewplus中的时间单选框up-datetime-picker的使用方法 前言 在实际开发中,我们经常需要使用时间选择器来让用户选择特定的时间。本文将详细介绍uviewplus中up-datetime-picker组件的使用方法,特别是在处理年月选择时的一些关键实现,因为官方有很多相关的功能和方法…

高质量翻译在美国推广移动应用中的重要性

美国的移动应用市场是世界上竞争最激烈、利润最高的市场之一,为开发者提供了接触数百万潜在用户的机会。然而,进入这个市场需要的不仅仅是创新技术或令人信服的想法;它要求与目标受众进行有效地沟通和文化契合。在这个过程中,高质…

基于Python的PDF批量转化工具

一、开发的缘由 最近,有网友想让我帮他做一个批量把png, docx, doc, pptx, ppt, xls, xlsx文件转化为PDF格式的软件,完全傻瓜式的操作,把文件拖进去就进行转化那种,简单实用。之前,有过一个vbs的文件,可以…

模型案例:| 手机识别模型!

导读 2023年以ChatGPT为代表的大语言模型横空出世,它的出现标志着自然语言处理领域取得了重大突破。它在文本生成、对话系统和语言理解等方面展现出了强大的能力,为人工智能技术的发展开辟了新的可能性。同时,人工智能技术正在进入各种应用领…

【Copilot 】TAB keybinding not working on JetBrains Client

pycharm ssh 远程到ubuntu24.04 发现tab就是tab,无法输出copilot给出的自动补全到便捷器里。禁用host的copilot插件,重新启动ide就好了。解决办法 参考大神的办法删除主机和客户端插件中的 Copilot插件。 仅在客户端中重新安装 Copilot 插件。 我只是禁用也可以 对比了键盘映…

【Linux】程序的编译过程

程序的翻译过程 预处理(头文件展开,条件编译,宏替换,去注释)编译 :把c变成汇编语言汇编 :把汇编变成二进制(不可执行,二进制目标文件)链接 :把自…

发布订阅者=>fiber=>虚拟dom

文章目录 vue的响应式原理-发布订阅者模式vue3 响应式原理及优化fiberfiber 与 虚拟dom vue的响应式原理-发布订阅者模式 Vue响应式原理概述 Vue.js的响应式原理是其核心特性之一。它使得当数据发生变化时,与之绑定的DOM元素能够自动更新。其主要基于数据劫持和发布…

Trunk链路操作题

Trunk链路操作题 论证:

C# 设计模式--建造者模式 (Builder Pattern)

定义 建造者模式是一种创建型设计模式,它允许你逐步构建复杂对象,而无需使用多个构造函数或重载。建造者模式将对象的构建过程与表示分离,使得相同的构建过程可以创建不同的表示。 正确写法 假设我们有一个复杂的 Car 对象,需要…

【计算机网络】实验7:默认路由和特定主机路由以及路由环路问题

实验 7:默认路由和特定主机路由以及路由环路问题 一、 实验目的 了解默认路由以及特定主机路由。 了解静态路由配置错误导致的路由环路问题。 二、 实验环境 • Cisco Packet Tracer 模拟器 三、 实验内容 1、默认路由以及特定主机路由 (1) 第一步&#xff…

特殊的数学性质

一个数模9的结果等于它的每一位数相加和模9

JSP知识点总结

jsp九大对象 在jsp中内置了9个对象,无需创建该对象即可使用。其名称为固定名称。 1.out输出对象 - 属于JspWriter print(): 输出 flush(): 刷新 close(): 关闭 2.request请求对象 - 属于HttpServletRequest getParameter(): 获取请求的参数 setCharacterEncodin…

电子信息工程自动化 基于单片机的居室安全报警系统

摘要 本课题设计了基于STM32F103C6T6单片机为主控核心的居室安全报警系统。为了解决家庭居室的安全监控,通过温湿度芯片SHT30、烟雾传感器MQ-2、天然气传感器MQ-4来获取居室的温湿度、烟雾、天然气含量,使用了一个热释电传感器、菲涅耳透镜、红外传感信…

【vue3 for beginner】Pinia基本用法:存储user的信息

🌈Don’t worry , just coding! 内耗与overthinking只会削弱你的精力,虚度你的光阴,每天迈出一小步,回头时发现已经走了很远。 📗概念 Pinia 简介 Pinia 是一个用于 Vue.js 应用的状态管理库,是 Vuex 的…