服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

在java中基于udp协议编程

在java中基于udp协议编程    在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();
     }
   }

扫描关注微信公众号