Java 中通信接口

Java 中通信接口

  • 1、Java UDP 通信核心接口介绍
    • 1、DatagramSocket 类
    • 2、DatagramPacket 类
    • 3、UDP客户端与UDP服务器通信例子
  • 2、Java TCP 通信核心接口介绍
    • 1、ServerSocket 类
    • 2、Socket 类
    • 3、输入输出流常见包装类
    • 4、TCP 客户端与 TCP 服务器通信例子

Java 网络通信基于 Socket(套接字) 编程,分为两大类:

协议特点
TCPSocket, ServerSocket面向连接、可靠、数据顺序、有流控制
UDPDatagramSocket, DatagramPacket无连接、不可靠、快速、无序、面向数据报

1、Java UDP 通信核心接口介绍

你这个程序使用的是 UDP 协议,使用类有:

DatagramSocket:用于发送和接收数据包(Socket 实例)

DatagramPacket:用于封装发送或接收的数据内容

1、DatagramSocket 类

这个类代表一个 UDP 套接字(Socket),可以发送或接收 DatagramPacket

DatagramSocket socket = new DatagramSocket();         // 客户端:系统自动分配本地端口
DatagramSocket socket = new DatagramSocket(port);     // 服务器:绑定到指定端口
方法说明
send(DatagramPacket p)发送一个数据报
receive(DatagramPacket p)接收一个数据报(阻塞)
close()关闭套接字,释放端口

UDP 是无连接的通信,所以只需要发送和接收数据报,不需要建立连接。

2、DatagramPacket 类

这个类是一个 数据包容器,既可以用于发送数据,也可以用于接收数据。

发送端构造方法:

DatagramPacket packet = new DatagramPacket(byte[] buf, int length, InetAddress address, int port);
参数说明
buf要发送的数据字节数组
length字节数组长度
address目标主机地址(InetAddress.getByName(“127.0.0.1”))
port目标端口号

接收端构造方法:

DatagramPacket packet = new DatagramPacket(byte[] buf, int length);
参数说明
buf用来接收数据的字节数组
length缓冲区大小

常用方法:

方法说明
getData()获取数据字节数组(包含整个缓冲区)
getLength()获取实际接收到的数据长度
getSocketAddress()获取发送方的地址和端口
getAddress() / getPort()获取 IP 地址 / 端口号

3、UDP客户端与UDP服务器通信例子

下面是简单清晰的 UDP 客户端与服务器通信例子:

UdpEchoServer.java(服务器

package thread;import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;public class UdpEchoServer {public static void main(String[] args) throws IOException {// 创建 DatagramSocket,绑定端口 9090DatagramSocket socket = new DatagramSocket(9090);System.out.println("服务器已启动,监听端口 9090...");while (true) {// 接收客户端发来的数据包byte[] buffer = new byte[1024]; // 缓冲区DatagramPacket receivePacket = new DatagramPacket(buffer, buffer.length);socket.receive(receivePacket);  // 阻塞接收// 读取数据内容String message = new String(receivePacket.getData(), 0, receivePacket.getLength());System.out.println("收到客户端消息:" + message);// 构造响应内容(原样返回加上后缀)String response = "回显:" + message;byte[] responseData = response.getBytes();// 构造响应数据包,目标为收到的客户端地址和端口DatagramPacket responsePacket = new DatagramPacket(responseData,responseData.length,receivePacket.getAddress(),receivePacket.getPort());// 发送响应数据包socket.send(responsePacket);}}
}

UdpEchoClient.java(客户端

package thread;import java.io.IOException;
import java.net.*;
import java.util.Scanner;public class UdpEchoClient {public static void main(String[] args) throws IOException {// 创建 DatagramSocket,系统自动分配端口DatagramSocket socket = new DatagramSocket();// 服务器地址和端口InetAddress serverAddress = InetAddress.getByName("127.0.0.1");int serverPort = 9090;Scanner scanner = new Scanner(System.in);System.out.println("请输入内容,输入 exit 退出:");while (true) {System.out.print(">> ");String input = scanner.nextLine();if ("exit".equalsIgnoreCase(input)) {break;}// 构造发送数据包byte[] data = input.getBytes();DatagramPacket sendPacket = new DatagramPacket(data, data.length, serverAddress, serverPort);socket.send(sendPacket);// 接收服务器响应byte[] buffer = new byte[1024];DatagramPacket receivePacket = new DatagramPacket(buffer, buffer.length);socket.receive(receivePacket);// 打印响应String response = new String(receivePacket.getData(), 0, receivePacket.getLength());System.out.println("来自服务器:" + response);}socket.close();}
}

2、Java TCP 通信核心接口介绍

Java 中使用 TCP 协议 通信的主要类有:

Socket:表示客户端或服务端通信时的“套接字”

ServerSocket:服务端专用,用于监听客户端连接请求

1、ServerSocket 类

ServerSocket 是服务端用来监听某个端口的类,接收到连接请求后会生成 Socket 进行数据通信。

构造方法:

ServerSocket serverSocket = new ServerSocket(port); // 监听指定端口

常用方法:

方法说明
accept()接收客户端连接,返回一个 Socket,阻塞方法
close()关闭监听,释放端口资源

说明accept() 是阻塞的,直到有客户端连接才会继续执行。

2、Socket 类

Socket 表示客户端套接字,也用于服务端与某个客户端通信的 Socket 实例。

构造方法(客户端使用)

ServerSocket serverSocket = new ServerSocket(port); // 监听指定端口

常用方法:

方法说明
getInputStream()获取输入流,用于读取数据(来自对方)
getOutputStream()获取输出流,用于发送数据(给对方)
close()关闭连接

3、输入输出流常见包装类

包装类组合用途
InputStreamReader + BufferedReader读取字符串(按行读取)
OutputStream + PrintWriter发送字符串(可自动 flush)

4、TCP 客户端与 TCP 服务器通信例子

TCP 服务器(TcpEchoServer.java)

package thread;import java.io.*;
import java.net.*;public class TcpEchoServer {public static void main(String[] args) throws IOException {// 1. 创建 ServerSocket,监听端口 9090ServerSocket serverSocket = new ServerSocket(9090);System.out.println("TCP服务器启动,监听端口 9090...");// 2. 等待客户端连接(阻塞)Socket clientSocket = serverSocket.accept();System.out.println("客户端已连接:" + clientSocket.getRemoteSocketAddress());// 3. 获取输入输出流BufferedReader reader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));PrintWriter writer = new PrintWriter(clientSocket.getOutputStream(), true); // 自动刷新// 4. 循环读取客户端消息并回显String message;while ((message = reader.readLine()) != null) {System.out.println("客户端说:" + message);writer.println("回显:" + message);}// 5. 关闭连接reader.close();writer.close();clientSocket.close();serverSocket.close();}
}

TCP 客户端(TcpEchoClient.java)

package thread;import java.io.*;
import java.net.*;
import java.util.Scanner;public class TcpEchoClient {public static void main(String[] args) throws IOException {// 1. 创建 Socket,连接到服务器Socket socket = new Socket("127.0.0.1", 9090);System.out.println("已连接到服务器!");// 2. 获取输入输出流BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));PrintWriter writer = new PrintWriter(socket.getOutputStream(), true); // 自动刷新Scanner scanner = new Scanner(System.in);System.out.println("请输入要发送的内容,输入 exit 退出:");// 3. 发送和接收消息while (true) {System.out.print(">> ");String input = scanner.nextLine();if ("exit".equalsIgnoreCase(input)) {break;}writer.println(input); // 发送数据String response = reader.readLine(); // 接收响应System.out.println("服务器回复:" + response);}// 4. 关闭连接socket.close();}
}

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

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

相关文章

树种识别与碳储量计算:基于多源遥感数据与深度学习的融合框架

树种识别与碳储量计算:基于多源遥感数据与深度学习的融合框架 1. 引言:背景与意义 森林作为陆地生态系统的主体,在全球碳循环中扮演着至关重要的角色。精准估算森林生物量及其蕴含的碳储量,是评估区域乃至全球碳收支、应对气候变化、制定森林管理策略的核心科学问题。传统…

如何高效地将照片从 Android 传输到计算机

“如何将图片从 Android 设备传输到笔记本电脑?”我们在 Quora 上发现了这个问题,这篇文章中有不同的答案。如果您对此感到好奇,请不要错过这篇文章,因为在检查所有答案和其他在线帖子并进行测试后,我们整理了 6 种经过…

httpget请求与获取返回值

首先需要在pom中添加对应包信息 <dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.13</version> </dependency> <dependency><groupId>com.alibaba<…

Rust交互式编程环境Jupyter Lab搭建

windows 11wsl2Ubuntu 24.04.1 LTS Installer.exerust-1.88.0-x86_64-unknown-linux-gnu.tar.xzevcxr_jupyter-v0.20.0-x86_64-unknown-linux-gnu.tar.gzMiniconda3-py312_25.1.1-2-Linux-x86_64.sh /etc/apt/sources.list配置镜像源&#xff08;最好先删除sources.list.d的官…

理解WebGL中的顶点着色器和片元着色器

WebGL是一种基于OpenGL ES的JavaScript API&#xff0c;它允许我们在网页上直接渲染3D图形而无需任何插件。WebGL的核心是着色器编程&#xff0c;它主要包含两种着色器&#xff1a;顶点着色器(Vertex Shader)和片元着色器(Fragment Shader)。 顶点着色器负责处理每个顶点的位置…

从UI设计到数字孪生:构建智慧城市的数据可视化体系

hello宝子们...我们是艾斯视觉擅长ui设计、前端开发、数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩! 在城市化进程加速与数字化转型的双重驱动下&#xff0c;智慧城市正从概念走向落地 —— 据 ID…

OpenCV图像旋转:单点旋转与图片旋转

1. 引言 图像旋转是计算机视觉中最基础也是最重要的几何变换之一&#xff0c;在图像处理、计算机视觉、医学影像分析等领域有着广泛应用。OpenCV作为最流行的计算机视觉库&#xff0c;提供了强大的图像旋转功能。本文将深入探讨OpenCV中的两种旋转方式&#xff1a;基于单点的仿…

yolov11安装,训练模型,tensorrtx加速,Qt预测图像

文章目录 一. yolov11 python环境安装二. windows10下yolov11 tensorrtx推理加速三. windows10下qt调用tensorrtx加速的yolov11进行检测 一. yolov11 python环境安装 基础环境 CUDA&#xff1a;cuda_11.8.0_522.06_windows cudnn&#xff1a;cudnn-windows-x86_64-8.6.0.163_c…

生物化学 PCR(聚合酶链式反应)引物 制造(固相磷酰胺化学法) 购买 存储

引物&#xff08;Primer&#xff09; 引物&#xff08;Primer&#xff09;是一小段单链 DNA&#xff08;通常 18~25 个碱基&#xff09;&#xff0c;与模板 DNA 的特定位点互补。包括&#xff1a;Forward Primer&#xff08;正向引物&#xff09;和 Reverse Primer&#xff08…

SQL server 获取表中所有行的序号 不够四位数的前面补0

在 SQL Server 中&#xff0c;如果你想要为表中的行编号&#xff08;即序号&#xff09;添加前导零&#xff0c;以便它们总是呈现为四位数&#xff0c;你可以使用多种方法来实现这一点。以下是几种常用的方法&#xff1a; 方法1&#xff1a;使用 RIGHT 和 REPLICATE 函数 如果…

热门话题!网关模块解决AB机器人和电压控制器EtherCAT转Ethernet/IP难题

网关模块&#xff1a;解决AB机器人与电压控制器通讯难题 在现代工业自动化生产中&#xff0c;不同设备之间的通信与协同至关重要。然而&#xff0c;由于设备品牌、型号以及所采用的通信协议各异&#xff0c;常常会出现通信兼容性问题。本案例将详细介绍如何运用捷米特JM-ECTM-E…

将attribute数据动态写入到excel上

将attribute数据动态写入到excel上 显示效果&#xff1a; I 大体思路&#xff1a; excel range name就设置为attribute_数字_类型&#xff0c;在创建template的时候&#xff0c;通过API得到这个event有几个attribute&#xff0c;就创建几列&#xff0c;同时还要根据不同的类…

Stable Diffusion入门-ControlNet 深入理解 第一课:ControlNet,控制AI绘图的“大杀器”

大家好&#xff0c;欢迎来到Stable Diffusion入门-ControlNet深入理解系列的第一课&#xff01; 今天&#xff0c;我们要聊聊一个让AI绘画从“盲目生成”走向“精准控制”的神奇插件——ControlNet。 它就像一位无声的魔术师&#xff0c;把原本随意的AI生成图片变得有条不紊、…

新生代潜力股刘小北:演艺路上的璀璨新星

在娱乐圈新人辈出的当下&#xff0c;一位来自四川的年轻演员正凭借着自己独特的魅力和扎实的演技&#xff0c;悄然走进观众的视野&#xff0c;他就是刘小北。1998年出生的刘小北&#xff0c;毕业于四川电影电视学院&#xff0c;自踏入演艺圈以来&#xff0c;便以坚定的步伐在演…

强制IDEA始终使用Java 8

解决IDEA总是使用Java 21而非Java 8编译的问题 您遇到的问题是典型的IDE内置JDK与项目冲突的情况。即使系统只安装了Java 8&#xff0c;IntelliJ IDEA仍内置有最新的Java运行时&#xff0c;导致它使用Java 21来编译您的代码。 解决方案&#xff1a;强制IDEA始终使用Java 8 1…

青少年编程与数学 01-012 通用应用软件简介 14 词典及翻译资源

青少年编程与数学 01-012 通用应用软件简介 14 词典及翻译资源 一、什么是词典及翻译资源&#xff08;一&#xff09;词典及翻译资源的基本定义&#xff08;二&#xff09;词典及翻译资源的工作原理&#xff08;三&#xff09;词典及翻译资源的类型 二、词典及翻译资源的重要意…

AI测试革命:5分钟自动生成单元测试|覆盖率和边界测试实战指南

AI测试革命&#xff1a;5分钟自动生成单元测试&#xff5c;覆盖率和边界测试实战指南 你是否曾为编写测试用例绞尽脑汁&#xff1f;是否因遗漏边界条件导致上线后BUG频发&#xff1f;告别低效测试&#xff0c;掌握AI赋能的现代化测试策略&#xff01; 一、为什么我们需要AI测试…

n8n Docker Compose部署

n8n Docker Compose 部署官方文档详细总结 1. 前提条件 具备服务器、容器、网络和安全相关基础知识。推荐有 Linux 运维经验。已准备好一台服务器&#xff08;建议为云服务器或本地服务器&#xff09;。 2. 安装 Docker 和 Docker Compose 以 Ubuntu 为例&#xff0c;完整命…

Talk is cheap. Show me the code.手搓一个 Wayland 客户端程序

前几天我写了一篇万字长文《万字长文详解 Wayland 协议、架构》&#xff0c;但光讲协议分析难免有些枯燥。毕竟&#xff0c;程序员更信奉那句名言&#xff1a;Talk is cheap. Show me the code. 所以这篇文章不打算长篇大论&#xff0c;而是通过编写一个简单的 Wayland 客户端程…

Golang JSON 标准库用法详解

JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式&#xff0c;Go语言的标准库encoding/json提供了强大的JSON处理能力。下面我将详细介绍各种用法并提供示例代码。 1. 基本编码&#xff08;Marshal&#xff09; 将Go数据结构转换为JSON字符串。 package maini…