如何应用DataGram进行用户-服务器编程

简介:


Java编程艺术》章节选登。作者:高永强 清华大学出版社 (即将出版)


23.2.5  Datagram编程 (1)

数据报表 Datagram ,或称数报式数据传输技术,利用 UDP 通讯协议( User Datagram Protocol ),进行用户 - 服务器间的数据传递,但 Java 虚拟机将 UDP  底层通讯细节隐藏,编程人员不必顾及其通讯协议和过程,只需利用 java.net 包中提供的 API DatagramSocket DatagramPacket 进行程序设计,调用适当的方法,实现用户 - 服务器编程。其中 DatagrameScoket 用来创建端口间的通讯,而 DatagramPacket 用来获取通过网络地址和端口以邮包方式( Packet )发送来的信息。表 23.4 列出了 java.net 包中 DataramSocket DataramPacket 的常用构造器以及方法。
23.4  DatagramSocket DatagramPacket 类的常用构造器以及方法
构造器 / 方法
    
DatagramSocket(int port,InetAdrress  address)
按指定端口和互联网地址创建对象。
  close()
关闭插座连接。
  connect(InetAddress address, int port)
按指定互联网地址和端口连接。
  disconnect()
断开当前的连接。
  InetAddress getInetAddress()
返回当前数报插座的互联网地址。
  InetAddress getLocalAddress()
返回当前数报插座的本机地址
  int getPort()
返回当前数报插座的连接端口。
  int getLocalPort()
返回当前数报插座的本机连接端口。
  receive(DatagramPacket packet)
接收当前数报插座的邮件。
  send(DatagramPacket packet)
发送当前数报插座的邮件。
DatagramPacket(byte[] buf, int length)
按指定缓冲数组合长度创建获取邮包的对象。
  InetAddress getAddress()
返回当前进行邮包传送的互联网地址。
  Byte[] getData()
返回当前发送或接收数据缓冲数组。
  int getLength()
返回当前发送或接收数据的长度。
  int getPort()
返回当前发送或接收数据的端口。
 
注意   DatagramSocket DatagramPacket 抛出检查性异常,程序中必须提供处理这些异常的代码。具体实例见下面的讨论。
 
下面的例子利用 DatagramSocket DatagramPacket ,模拟用户 - 服务器通讯,将用户        的英文输入,通过邮包发送到服务器端程序,转换为大写字母,并将结果传回到用户屏       幕。其功能类似于在 Socket ServerSocket 讨论过的程序,但增加了统计并返回邮包长度的操作。图 23.7 显示了这个例子的一个典型运行结果。图上方为服务器端程序运行后的 截图。(注:截图未能显示。请参考原书)
23.7   利用 Datagram 的典型运行结果
如下是利用 Datagram 编写的服务器端程序的代码:
 
// 这个程序存在本书配套资源目录 Ch23 名为 DatagramServerTest.java
import java.io. * ;
import java.net. * ;
public class DatagramServerTest {
    public static void main(String[] args) {
        System.out.println(\"Welcome! The server is running....\");
        String line = \"Datagram packet from server: I love Java programming.\\n\";
        String promptString = line.toUpperCase() + \"Enter quit to STOP\";
        try {
             DatagramSocket socket = new DatagramSocket(1688);
                                                // 创建指定端口的 Datagram
             DatagramPacket receivePacket;      // 声明接收邮包
             byte[] buf = new byte[256];        // 缓冲器
             receivePacket = new DatagramPacket(buf, buf.length);
                                                // 创建接收邮包
             socket.receive(receivePacket);     // 接收邮包
             buf = promptString.getBytes();     // 内容至缓冲
             InetAddress address = receivePacket.getAddress();
                                                // 得到接收地址
             int port = receivePacket.getPort();// 得到接收端口
             sending(socket, buf, buf.length, address, port);
                                                // 调用发送邮包方法
             while (true) {
                 buf = new byte[256];        // 清除缓冲
                 receivePacket = new DatagramPacket(buf, buf.length);
                                                // 创建新邮包
                 socket.receive(receivePacket); // 接收
                 String receive = new String(receivePacket.getData());                                                  // 得到邮包内容
                 buf = receive.toUpperCase().getBytes();
                                                // 内容转成大写并送往缓冲
                 sending(socket, buf, buf.length, address, port);// 发送
                 buf = new byte[256];           // 清除缓冲
                 String wordCount = \"(Converting from server and packet length: \" + receive.trim().length() + \")\";
                 receivePacket = new DatagramPacket(buf, buf.length);                                                   // 创建新邮包
                 socket.receive(receivePacket); // 接收
                 buf = wordCount.getBytes();    // 发件内容送往缓冲
                 sending(socket, buf, buf.length, address, port);
                                                // 调用发送方法
             }
        }
        catch (IOException e) {
             e.printStackTrace();
        }
     }
    // 发送邮件方法
    public static void sending(DatagramSocket socket, byte[] buf, int length, InetAddress address, int port) {
            DatagramPacket sendPacket = new DatagramPacket(buf, length,                 address, port);
            try {
                socket.send(sendPacket);        // 发送
            }catch (IOException e) {
                e.printStackTrace();
            }
    }
 }
 
代码中首先接收用户端发送过来的一个空邮包,并利用这个邮包发送慰问和提示信息到用户。在循环中,接收用户发来的邮包内容,并将其转换成大写字母、统计字符串即邮包长度,调用自定义静态方法 sending() 将结果邮包发还给发来的用户。代码中在重新利用缓冲器发送新内容时,利用重新定义缓冲器来清除其原有内容。(待续



















本文转自高永强51CTO博客,原文链接: http://blog.51cto.com/yqgao/157391 ,如需转载请自行联系原作者
相关文章
|
JavaScript API 开发者
使用 u-navbar 组件实现页面导航和布局的完全指南
使用 u-navbar 组件实现页面导航和布局的完全指南
2382 0
|
存储 安全 Java
ArrayBlockingQueue 和 LinkedBlockingQueue 有什么区别?
ArrayBlockingQueue 和 LinkedBlockingQueue 有什么区别?
|
13天前
|
Kubernetes 应用服务中间件 API
【重磅推荐】告别Ingress NGINX后,我们的思考和建议
K8s社区宣布Ingress NGINX将于2026年3月正式退役:虽API仍受支持,但停止更新与安全修复。主因是高危漏洞频发(如CVE-2025-1974)、维护者严重不足及架构技术债沉重。推荐生产环境平滑迁移至阿里云ALB Ingress——免运维、高SLA、兼容NGINX注解,并迈向Gateway API标准化未来
176 2
|
1月前
|
运维 自然语言处理 IDE
Claude Opus 4.6进入“双模式时代”:企业是否需要选择“快速模式”?
大模型成熟后,企业关注点转向效率、可控性与规模化部署。Anthropic推出Claude Opus 4.6“快速模式”,形成双结构设计。本文从企业视角解析:何时需要快速模式、是否真正降本、如何在云架构中放大价值,揭示双模式正成为高端模型工程化新标配。
|
11月前
|
人工智能 算法 网络安全
基于PAI+专属网关+私网连接:构建全链路Deepseek云上私有化部署与模型调用架构
本文介绍了阿里云通过PAI+专属网关+私网连接方案,帮助企业实现DeepSeek-R1模型的私有化部署。方案解决了算力成本高、资源紧张、部署复杂和数据安全等问题,支持全链路零公网暴露及全球低延迟算力网络,最终实现技术可控、成本优化与安全可靠的AI部署路径,满足企业全球化业务需求。
|
5月前
|
人工智能 安全 架构师
2025云栖大会 | 阿里云网络技术Session主题资料和视频回放归档
2025年9月24日-26日,杭州,一年一度的云栖大会如期而至;阿里云飞天洛神云网络作为阿里云计算的连接底座,是飞天云操作系统的核心组件,致力于为上云企业提供高可靠、高性能、高弹性、智能的连接服务。本次云栖,云网络产品线也带来全系列产品升级,以及创新技术重磅解读,围绕增强确定性、提效自动化、深耕智能化和敏捷全球化带来技术、产品和服务升级,以及全新的云网络产品生态合作计划发布。
743 4
|
6月前
|
存储 运维 数据可视化
短剧为什么比长剧更依赖云和网络?
微短剧对云与网络的依赖远高于传统影视,因其制作周期短、投流驱动强、数据量大、IT团队轻量化及出海需求迫切。短剧的成功离不开高速传输、实时数据反馈、多云互联与跨境合规传输。一套理想的云网方案应具备高速文件传输、多云互联、跨境加速与合规、实时数据回传及可视化管理能力,助力短剧企业快速响应市场、提升投放效率、实现全球化分发。
|
机器学习/深度学习 算法 搜索推荐
《朴素贝叶斯:开启客户细分与精准营销的智能引擎》
在竞争激烈的商业环境中,客户细分和精准营销至关重要。朴素贝叶斯算法基于贝叶斯定理,假设特征独立,通过计算特征概率实现高效分类。该算法帮助企业深入理解客户,优化资源利用。通过收集多维度数据、特征提取与预处理、模型训练及客户分类,企业能制定个性化营销策略,提升转化率和客户忠诚度。某电商平台的成功案例显示,该算法显著提高了营销效果和投资回报率。
375 20
|
容灾 关系型数据库 数据库
阿里云RDS服务巴黎奥运会赛事系统,助力云上奥运稳定运行
2024年巴黎奥运会,阿里云作为官方云服务合作伙伴,提供了稳定的技术支持。云数据库RDS通过备份恢复、实时监控、容灾切换等产品能力,确保了赛事系统的平稳运行。
 阿里云RDS服务巴黎奥运会赛事系统,助力云上奥运稳定运行