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

本文涉及的产品
全球加速 GA,每月750个小时 15CU
简介:


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 ,如需转载请自行联系原作者
目录
打赏
0
0
0
0
143
分享
相关文章
使用 u-navbar 组件实现页面导航和布局的完全指南
使用 u-navbar 组件实现页面导航和布局的完全指南
1945 0
质量规则支持自定义属性,规则管理更便捷
随着企业数据治理开展到一定阶段,对质量监控规则的精细化管理诉求进一步提升,需要为质量规则配置更多属性信息以支持后续的统计的分析。Dataphin V4.0版本新增了自定义质量规则属性的能力,通过简单的配置即可实现灵活、高效的规则管理,满足多样化诉求。
413 0
阿里云安全体检功能评测报告
阿里云安全体检功能评测报告
132 7
HTML5 WebSocket详解
**WebSocket** 是一种协议,支持浏览器与服务器间的双向全双工通信。不同于传统的 HTTP 模式,WebSocket 建立持久连接,使服务器能主动向客户端推送数据。本文详细解析 WebSocket 的工作原理、优缺点及应用场景,并提供客户端和服务器端的代码示例。WebSocket 适合实时聊天、在线游戏、数据监控等场景,能显著提升用户体验和应用性能,但需注意其实现复杂性和安全性问题。
从前端到后端:构建响应式网站的全栈技术探索
本文将深入探讨如何从前端到后端构建一个响应式网站,涵盖了多种技术。我们将从前端开发的基础知识出发,逐步介绍后端开发和各种编程语言(如Java、Python、C、PHP、Go)在构建响应式网站中的应用。同时,还将讨论数据库的重要性以及如何与前后端进行数据交互。本文旨在为读者提供全面的全栈技术知识,帮助他们构建功能强大且用户友好的网站。
JMeter 介绍与安装
Apache JMeter 是一款基于Java的开源性能和负载测试工具,常用于测试Web应用、Web服务、数据库及其他网络服务的性能。它具备跨平台特性,支持Windows、Mac及Linux系统,并可通过插件进行扩展。JMeter不仅能模拟大量用户访问以测试服务器承压能力,还适用于接口测试,支持分布式部署与UI及命令行操作模式。
macos的AppCode破解安装激活2022-09-07最新教程(附破解工具及激活码)
本文讲的是AppCode破解、AppCode激活码、AppCode安装、AppCode永久激活码的最新永久激活教程。
1399 0
macos的AppCode破解安装激活2022-09-07最新教程(附破解工具及激活码)
IoT 设备定位服务:GPS,移动基站、WiFi
IoT企业物联网平台提供基于GPS,移动基站、WiFi热点的定位服务
3879 1
IoT 设备定位服务:GPS,移动基站、WiFi
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问