快速业务通道

基于Java的UDP协议程序设计初探 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-23

基于Java的UDP协议程序设计初探

时间:2010-12-03

在Java中进行网络编程是相对容易的,因为J2SE中的java.net包已经对各种通信协议很好的进行了封装,本文主要讲述如何基于UDP(用户数据报)协议编写应用程序。

通常我们进行网络编程一般都是使用基于socket的TCP/IP编程,毕竟TCP/IP应用非常的广泛,比如我们浏览互联网就是基于HTTP协议、我们发送邮件是通过SMTP协议。它们都是基于TCP/IP的。TCP/IP的传输最重要的是它可以保证数据到达目的地,而UDP则不同他并不保证准确的传输,数据有可能丢失。如果有兴趣的话,读者可以参考《计算机网络》一书。

在介绍UDP编程之前有必要介绍一个重要的类InetAddress,用最简单的一句话描述这个类的作用就是:它代表了一个IP地址。这非常重要在互联网中如果知道了IP地址则意味着我们知道了通信的端点。这个类没有构造器但是有几个工厂方法,通过传递不同的参数例如IP,Hostname等来得到一个InetAddress的实例,下面的这个小例子可以得到我机器的IP地址。

import java.net.*; public class TestNet {  public static void main(String[] args) throws Exception  {   InetAddress ia = InetAddress.getByName("compaq");   String ipAdr = ia.getHostAddress();   System.out.println(ipAdr);  } }

当然我的机器的名字为compaq,如果你传入localhost的话将会得到127.0.0.1。

接下来开始讲述如何使用UDP编程,这非常容易理解,我们应该首先构造一个数据报,然后把它发送出去,同时我们也可以接收数据报。在java中提供了DatagramPacket和DatagramSocket两个类来完成这样的任务,前者负责构造数据报后者负责发送和接收。看看DatagramPacket的构造器

DatagramPacket(byte[] buf, int length, InetAddress address, int port) DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port) DatagramPacket(byte[] buf, int offset, int length, SocketAddress address) DatagramPacket(byte[] buf, int length, SocketAddress address) DatagramPacket(byte[] buf, int length) DatagramPacket(byte[] buf, int offset, int length)

其中前面四个是为构造发送的数据报而用的,因为他们有InetAddress或者SocketInetAddress作为接收端点的地址,后面一个则是为了接受数据报用的。

同样我们编写一个C/S模型的例子来说明如何使用这两个重要的类,如果对API还不熟悉请参考Java doc。下面的程序在本机构造一个时间服务器,客户端来取得时间。以前曾经写过类似的时间服务器程序,不过这个是基于UDP的编程。

import java.io.*; import java.net.*; import java.util.*; public class TimeServer {  final private static int DAYTIME_PORT = 13;  public static void main(String args[]) throws   IOException {    DatagramSocket socket = new DatagramSocket(DAYTIME_PORT);    while (true) {     byte buffer[] = new byte[256];     DatagramPacket packet =new DatagramPacket(buffer, buffer.length);     socket.receive(packet);     String date = new Date().toString();     buffer = date.getBytes();     // Get response address/port     // for client from packet     InetAddress address = packet.getAddress();     int port = packet.getPort();     packet = new DatagramPacket(buffer, buffer.length, address, port);     socket.send(packet);    }  } } import java.io.*; import java.net.*; public class GetTime {  final private static int DAYTIME_PORT = 13;  public static void main(String args[]) throws  IOException {   if (args.length == 0) {    System.err.println("Please specify daytime host");    System.exit(-1);   }   String host = args[0];   byte message[] = new byte[256];   InetAddress address = InetAddress.getByName(host);   System.out.println("Checking at: " + address);   DatagramPacket packet = new DatagramPacket(message, message.length,   address, DAYTIME_PORT);   DatagramSocket socket = new DatagramSocket();   socket.send(packet);   packet =new DatagramPacket(message, message.length);   socket.receive(packet);   String time = new String(packet.getData());   System.out.println(The time at "+ host + " is: " + time);   socket.close();  } }

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号