小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

基于Java的UDP協(xié)議程序設(shè)計(jì)初探

 ShangShujie 2007-07-20

基于Java的UDP協(xié)議程序設(shè)計(jì)初探

2004-09-04 14:31 作者: mingjava 出處: 論壇 責(zé)任編輯:
");
"); 在Java中進(jìn)行網(wǎng)絡(luò)編程是相對(duì)容易的,因?yàn)镴2SE中的java.net包已經(jīng)對(duì)各種通信協(xié)議很好的進(jìn)行了封裝,本文主要講述如何基于UDP(用戶數(shù)據(jù)報(bào))協(xié)議編寫(xiě)應(yīng)用程序。

通常我們進(jìn)行網(wǎng)絡(luò)編程一般都是使用基于socket的TCP/IP編程,畢竟TCP/IP應(yīng)用非常的廣泛,比如我們?yōu)g覽互聯(lián)網(wǎng)就是基于HTTP協(xié)議、我 們發(fā)送郵件是通過(guò)SMTP協(xié)議。它們都是基于TCP/IP的。TCP/IP的傳輸最重要的是它可以保證數(shù)據(jù)到達(dá)目的地,而UDP則不同他并不保證準(zhǔn)確的傳 輸,數(shù)據(jù)有可能丟失。如果有興趣的話,讀者可以參考《計(jì)算機(jī)網(wǎng)絡(luò)》一書(shū)。

  在介紹UDP編程之前有必要介紹一個(gè)重要的類 InetAddress,用最簡(jiǎn)單的一句話描述這個(gè)類的作用就是:它代表了一個(gè)IP地址。這非常重要在互聯(lián)網(wǎng)中如果知道了IP地址則意味著我們知道了通信 的端點(diǎn)。這個(gè)類沒(méi)有構(gòu)造器但是有幾個(gè)工廠方法,通過(guò)傳遞不同的參數(shù)例如IP,Hostname等來(lái)得到一個(gè)InetAddress的實(shí)例,下面的這個(gè)小例 子可以得到我機(jī)器的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);
 }
}

  當(dāng)然我的機(jī)器的名字為compaq,如果你傳入localhost的話將會(huì)得到127.0.0.1。

接下來(lái)開(kāi)始講述如何使用UDP編程,這非常容易理解,我們應(yīng)該首先構(gòu)造一個(gè)數(shù)據(jù)報(bào),然后把它發(fā)送出去,同時(shí)我們也可以接收數(shù)據(jù)報(bào)。在java中提供了 DatagramPacket和DatagramSocket兩個(gè)類來(lái)完成這樣的任務(wù),前者負(fù)責(zé)構(gòu)造數(shù)據(jù)報(bào)后者負(fù)責(zé)發(fā)送和接收??纯? DatagramPacket的構(gòu)造器

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)

  其中前面四個(gè)是為構(gòu)造發(fā)送的數(shù)據(jù)報(bào)而用的,因?yàn)樗麄冇蠭netAddress或者SocketInetAddress作為接收端點(diǎn)的地址,后面一個(gè)則是為了接受數(shù)據(jù)報(bào)用的。

  同樣我們編寫(xiě)一個(gè)C/S模型的例子來(lái)說(shuō)明如何使用這兩個(gè)重要的類,如果對(duì)API還不熟悉請(qǐng)參考Java doc。下面的程序在本機(jī)構(gòu)造一個(gè)時(shí)間服務(wù)器,客戶端來(lái)取得時(shí)間。以前曾經(jīng)寫(xiě)過(guò)類似的時(shí)間服務(wù)器程序,不過(guò)這個(gè)是基于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();
 }
}

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多