UDP Datagram DataPackage

5151 ワード

Datagram socketはUDPを使用してデータ通信を実現するため、データが目的地に到達することを保証することはできませんが、専用のネットワークリンクを必要としないため、必要なリソースは比較的少ないです.
データをロード中…
Datagramはパケットでデータを送信するが、これらのパケットが特定の順序で目的に到達することを保証することはできないため、パケットにはシーケンス番号の情報が含まれていることが多く、受信者はシーケンス番号の情報に基づいてすべてのパケットが受信されたかどうかを決定し、通常の順序でパケットを再グループ化することができる.
Javaは、2つのクラスのDatagramSocketとDatagramPacketによってDatagram socketをサポートします.DatagramSocketはDatagram socketの基本機能を実現し、DatagramPacketはパッケージのサポートを提供しています.
DatagramSocketのいくつかの重要な方法:
(1)DatagramSocket():有効なポートをランダムにバインドします.
(2)DatagramSocket(int port):指定したポートをバインドします.
(3)Void send(DatagramPacket p):送信先のアドレス情報がデータ新聞に含まれているため、本関数にアドレス情報を提供する必要はない.
(4)synchronized void receive(DatagramPacket p):パケットを受信し、スレッドが安全である.
(5)synchronized void close():socketを閉じる;
DatagramSocketではServer SocketとClientSocketは区別されず、必ず区別する必要がある場合はclientが送信され、受信するのはserverです.
DatagramPacketにはいくつかの重要な方法があります.
(1)DatagramPacket(byte ibuf[],int ilength):データ・レポートを受信するため;
(2)DatagramPacket(byte ibuf[],int ilength,InetAddress iaddr,int iport):送信用データ・レポート;
(3) byte[] getData();
(4) int getLength()
完全なDatagram Socketの例を次に示します.
受信側、Server側コード:
import java.io.*; 
import java.net.*; 
class FortuneServer1 extends Thread 
{ 
 DatagramSocket ServerSocket; 
 public FortuneServer1() 
 {  
  super("FortuneServer1"); 
  try
  { 
   ServerSocket = new DatagramSocket(1114); 
   System.out.println("FortuneServer up and running..."); 
  } 
  catch (SocketException e) 
  {
   System.err.println("Exception: couldn't create datagram socket"); 
   System.exit(1); 
  }
 }
 public static void main(String[] args) 
 { 
  FortuneServer1 server = new FortuneServer1(); 
  server.start(); 
 }
 public void run() 
 { 
  if (ServerSocket == null) 
   return; 
  while (true) 
  {
   try 
   { 
    InetAddress address; 
    int port;
    DatagramPacket packet; 
    byte[] data = new byte[128]; 
    packet = new DatagramPacket(data, data.length);     
    ServerSocket.receive(packet); 
                   //  1114         ,              
                   //       ,       packet   ,        
    address = packet.getAddress(); 
    port = packet.getPort(); 
    
    FileWriter fw = new FileWriter("Fortunes.txt");//     
             PrintWriter out = new PrintWriter(fw);    
             for(int i=0;i<data.length;i++){ 
        out.print(data[i]+"  ");
       }
    out.close();
             System.out.println("Data has been writen to destination!");
    
    //       ,           
    packet = new DatagramPacket(data, data.length, address, port); 
    ServerSocket.send(packet);
    System.out.println("Respond has been made!");
   } 
   catch (Exception e) 
   { 
    System.err.println("Exception: " + e); 
    e.printStackTrace(); 
   }
  } 
 } 
} 

説明:
(1)この例では受信側のsocketがマルチスレッドを用いている.
(2)コンストラクション関数にDatagramSocketが作成され、1114というポートが使用される.
(3)この例のキー関数はrunであり、それはデッドループを使用し、ループの中でreceiveという方法を使用して1114ポートに耳を傾け、1114ポートがデータの到来を要求していない場合、このプログラムはreceiveという位置にとどまり、これ以上実行しない.
(4)1114側にデータがある場合、receiveメソッドは受信したDatagramPacketパケットをpacketというオブジェクトに配置し、その中のデータを解析し、送信者のアドレス情報を取得する.
(5)その後、DatagramPacketパケットを作成し、データを埋め込み、元の受信側に送信する.
送信側のコードは次のとおりです.
import java.net.*;
class FortuneClient 
{ 
 public static void main(String args[]) 
 { 
  FortuneClient client = new FortuneClient();
  System.out.println(client.getMessage()); 
 }
 public String getMessage() 
 { 
  String fortune; 
  try { 
   DatagramSocket socket; 
   DatagramPacket packet;
   byte[] data = new byte[128];
   
   for(int i=0;i<data.length;i++){
    Integer integer=new Integer(i);
    data[i]=integer.byteValue();
   }
   
   socket = new DatagramSocket(); 
   //packet = new DatagramPacket(data, data.length,InetAddress.getByName("127.0.0.1"), 1114); 
   packet = new DatagramPacket(data, data.length,InetAddress.getLocalHost(), 1114);
   socket.send(packet); 
   
   packet = new DatagramPacket(data, data.length); 
   socket.receive(packet); 
   fortune = new String(packet.getData()); 
   socket.close();
  } 
  catch (UnknownHostException e) { 
   System.err.println("Exception: host could not be found"); 
   return null; 
  } 
  catch (Exception e) {
   System.err.println("Exception: " + e); 
   e.printStackTrace(); 
   return null; 
  } 
  return fortune; 
 } 
} 

クライアントのコードはサーバ側のコードとほぼ同じであるが,ループがなく,処理手順はサーバ側のコードとはほぼ逆である.これは、Datagram SocketがサーバとClientを本当に区別していないことを示しています.
この文書のソース:http://blog.csdn.net/sunny3106/archive/2007/06/03/1636595.aspx