如何应用DataGram进行用户-服务器编程-阿里云开发者社区

开发者社区> 技术小甜> 正文

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

简介:
+关注继续查看


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


23.2.5  Datagram编程 (1)

数据报表Datagram,或称数报式数据传输技术,利用UDP通讯协议(User Datagram Protocol),进行用户-服务器间的数据传递,但Java虚拟机将UDP 底层通讯细节隐藏,编程人员不必顾及其通讯协议和过程,只需利用java.net包中提供的APIDatagramSocketDatagramPacket进行程序设计,调用适当的方法,实现用户-服务器编程。其中DatagrameScoket用来创建端口间的通讯,而DatagramPacket用来获取通过网络地址和端口以邮包方式(Packet)发送来的信息。表23.4列出了java.net包中DataramSocketDataramPacket的常用构造器以及方法。
23.4  DatagramSocketDatagramPacket类的常用构造器以及方法
构造器/方法
    
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()
返回当前发送或接收数据的端口。
 
clip_image001.gif%5C%22注意  DatagramSocketDatagramPacket抛出检查性异常,程序中必须提供处理这些异常的代码。具体实例见下面的讨论。
 
下面的例子利用DatagramSocketDatagramPacket,模拟用户-服务器通讯,将用户      的英文输入,通过邮包发送到服务器端程序,转换为大写字母,并将结果传回到用户屏     幕。其功能类似于在SocketServerSocket讨论过的程序,但增加了统计并返回邮包长度的操作。图23.7显示了这个例子的一个典型运行结果。图上方为服务器端程序运行后的截图。(注:截图未能显示。请参考原书)
clip_image003.jpg%5C%22clip_image005.jpg%5C%22
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,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
【DataGuard】10GR 日志传输服务参数
日志的传输以及应用可以算作是Dataguard的核心所在.在我们搭建DG的过程中,如何配置优化日志传输服务,关系到整个DG体系的性能以及可用性.而且,不同的保护模式也需要不用的参数组合.
607 0
iOS6定位服务编程详解
<p>现在的移动设备很多都提供定位服务,使用iOS系统的iPhone、iPod Touch和iPad都可以提供位置服务,iOS设备能提供3种不同途径进行定位:Wifi, 蜂窝式移动电话基站, GPS卫星</p> <p><span id="more-218"></span></p> <p>iOS不像Android系统在定位服务编程时,可以指定采用哪种途径进行定位。iOS的API把底层这些细节屏蔽
1263 0
SAP UI5应用访问OData metadata的url和Destination
SAP UI5应用访问OData metadata的url和Destination
7 0
+关注
10146
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载