当前位置: 首页 > article >正文

java 网络编程 详解

Java 网络编程主要涉及使用 Java 中的套接字(Sockets)和服务器套接字(ServerSockets)来实现网络通信。这种方式可以使不同主机上运行的应用程序之间进行数据交换。以下是 Java 网络编程的几个关键概念和组件的详解:

1. 套接字编程(Socket Programming)

套接字(Socket)

套接字是两台机器之间通信的端点。在 Java 中,java.net.Socket 类代表客户端套接字,用于建立连接并与服务端交换数据。

服务器套接字(ServerSocket)

java.net.ServerSocket 类在服务端监听来自客户端的连接请求。它主要用于创建服务端套接字,等待并接受客户端的连接。

基本步骤

  1. 服务端创建 ServerSocket:服务端启动并在指定端口上监听客户端的连接请求。

    ServerSocket serverSocket = new ServerSocket(8080);
    
  2. 客户端创建 Socket 连接到服务端:客户端通过指定服务器的 IP 地址和端口号创建 Socket,以建立连接。

    Socket socket = new Socket("127.0.0.1", 8080);
    
  3. 通信:一旦连接建立,客户端和服务器就可以通过输入和输出流进行通信。

    // 服务端接受客户端连接
    Socket clientSocket = serverSocket.accept();
    
    // 获取输入流和输出流
    BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
    PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
    
    // 读取数据
    String inputLine;
    while ((inputLine = in.readLine()) != null) {
        System.out.println("Received: " + inputLine);
        out.println(inputLine); // 回传数据
    }
    
  4. 关闭连接:通信完成后,双方需要关闭连接。

    socket.close();
    serverSocket.close();
    

UDP 通信

除了基于 TCP 的套接字,Java 还支持 UDP 协议,这是另一种不需要建立连接的通信方式,通常用于不需要严格数据完整性的场合。

DatagramSocket 和 DatagramPacket

UDP 通信通过 java.net.DatagramSocketjava.net.DatagramPacket 来实现。

  • DatagramSocket:用于发送或接收数据包的套接字。
  • DatagramPacket:包含数据的数据包。
// 创建 DatagramSocket
DatagramSocket socket = new DatagramSocket();

// 发送数据
byte[] buf = new byte[256];
InetAddress address = InetAddress.getByName("127.0.0.1");
DatagramPacket packet = new DatagramPacket(buf, buf.length, address, 8080);
socket.send(packet);

// 接收数据
packet = new DatagramPacket(buf, buf.length);
socket.receive(packet);

网络 I/O 模型

Java 还支持非阻塞的网络 I/O,即 NIO(New Input/Output),它提供了与传统阻塞 I/O 不同的方式来处理网络通信。

  • Channels:相当于流的 NIO 版本,可以异步读写。
  • Buffers:数据容器,NIO 通过 Buffer 来进行数据处理。
  • Selectors:允许单线程处理多个 Channel,可以检测一个或多个 NIO 通道,并确定哪些通道已准备好进行读取或写入。

这些工具和模型为复杂的网络通信提供了高效和可扩展的解决方案。通过使用这些技术,开发人员可以构建高效、可扩展且响应迅速的网络应用程序。


http://www.kler.cn/a/420658.html

相关文章:

  • python脚本:Word文档批量转PDF格式
  • Day4:生信新手笔记 — R语言简单命令与Rstudio配置
  • OpenCV圆形标定板检测算法findCirclesGrid原理详解
  • 算法训练营day28(回溯算法04:复原IP地址,子集,子集2)
  • 《智能体雏形开发(高阶实操)》开发计划概述
  • SpringBoot+MyBatis整合ClickHouse实践
  • 数据结构判断两棵树是否相等
  • 九,[极客大挑战 2019]LoveSQL1
  • JavaWeb—— 构建互联网世界的 “魔法砖石” 与实战密码
  • 企业品牌曝光的新策略:短视频矩阵系统
  • 多模态抑郁估计论文研读|Multi-modal Depression Estimation Based on Sub-attentional Fusion
  • 【QNX+Android虚拟化方案】123 - 如何配置qnx侧GPIO_IRQ中断和PMIC_GPIO_IRQ中断
  • 【Android】View工作原理
  • Linux 内核系统架构
  • Kafka-Consumer源码分析
  • USB 声卡全解析:提升音频体验的得力助手
  • 网络安全之常用安全设备功能及作用_设备管理器安全设备是什么
  • Runway 技术浅析(六):文本到视频(Text-to-Video)
  • GPT时代的BI革命:智能报表系统如何颠覆传统决策
  • qt音频实战
  • Vue 实现无线滚动效果
  • Linux下anaconda安装环境
  • Docker和Docker Compose部署方式的区别以及各自适用的场景(ChatGPT-4o回答)
  • WPF+MVVM案例实战与特效(三十一)- 封装一个加载动画的自定义控件
  • 将一个数组逆序输出。-多语言
  • 【SQL】实战--组合两个表