基于Java的UDP协议措施设计初探
当前位置:以往代写 > JAVA 教程 >基于Java的UDP协议措施设计初探
2019-06-14

基于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();
 }
}

    关键字:

在线提交作业