JAVAネットワークプログラミングのUDP通信の実現手順

4657 ワード

UDPは、TCPと比較して、無接続のトランスポート層プロトコルであり、トランザクション向けの単純で信頼性の低い情報転送サービスを提供する.UDP通信は主に2つのクラスのDatagramPacketとDatagramSocketを用いており,以下ではそれぞれ紹介する.
1、DatagramSocket
具体的なapiは以下の通りです.http://www.javaweb.cc/help/JavaAPI1.6/index.html?java/nio/ReadOnlyBufferException.html
このような表現は、パケットを送信および受信するためのソケットを表す.
データ・レポート・ソケットは、パケット・配達サービスの送信または受信ポイントです.データ・レポート・ソケット上で送信または受信されるパケットは、それぞれ個別にアドレスおよびルーティングされる.1台のマシンから別のマシンに送信される複数のパケットは、異なるルーティングを選択するか、異なる順序で到着するかのいずれかである.
DatagramSocketでは、UDPブロードキャスト送信が常に有効になります.ブロードキャストパケットを受信するには、DatagramSocketをワイルドカードアドレスにバインドする必要があります.いくつかのインプリメンテーションでは、DatagramSocketがより特定のアドレスにバインドされたときにブロードキャストパケットが受信されてもよい.
構築方法:
DatagramSocket()~データ・レポート・ソケットを構築し、ローカル・ホストで使用可能なポートにバインドします.
protected DatagramSocket(DatagramSocketImpl impl)~指定されたDatagramSocketImpl(データ・レポートとマルチキャスト・ソケットで実装される抽象ベース・クラスを作成し、データ・レポート・ソケットをローカル・ポートとアドレスにバインドできます.)を選択します.
DatagramSocket(int port)~データ・レポート・ソケットを作成し、ローカル・ホスト上の指定したポートにバインドします.DatagramSocket(int port,InetAddress laddr)~データ・レポート・ソケットを作成し、指定したローカル・アドレスにバインドします.
DatagramSocket(SocketAddress bindaddr)~データ・レポート・ソケットを作成し、指定したローカル・ソケット・アドレスにバインドします.(SocketAddressは抽象クラスとして、特定のプロトコル関連のインプリメンテーションによってサブクラスを作成します.ソケットをバインド、接続、または戻り値として使用するための可変オブジェクトを提供します.)
DatagramSocket(DatagramSocketImpl impl)とDatagramSocket(SocketAddress bindaddr)は、1つのオブジェクトを介してローカルポートとアドレスのバインドを行う.......2、
DatagramPacket
このタイプは、パケットを表します.
データ・パケットは、接続されていないパケットの配達サービスを実現するために使用されます.各メッセージは、パケットに含まれる情報に基づいて1つのマシンから別のマシンにのみルーティングされます.1台のマシンから別のマシンに送信される複数のパケットは、異なるルーティングを選択するか、異なる順序で到着するかのいずれかである.小包配達を保証しない.
具体的なapiは以下の通りです.http://www.javaweb.cc/help/JavaAPI1.6/index.html?java/nio/ReadOnlyBufferException.html
3、通信プロセス
JAVA网络编程之UDP通讯的实现步骤_第1张图片
UDPベースのソケットは、データ・レポート・ソケット(Java.net.DatagramSocketj)です.
両方とも、対応するパケット(java.net.DatagramPacket)を構築する必要があります.
DatagramPacketパッケージの関数intgetLength()は実際に受け入れられたバイト数を返し、byte[]getData()は受け入れられたデータを返します.
送信側から送信側への返信情報を受信するには、送信側のIPアドレスInetAddress getAddress()と送信側プロセスにバインドされているポート番号int getPort()を知る必要があります.
データ・レポート・ソケットの送信に成功すると、仮想接続が確立され、双方がデータを送信できるようになります.
4、具体例(クライアントアクセスサーバ側)
サーバ側:
/*
 *     ,    UDP     
 */
public class UDPServer {
    public static void main(String[] args) throws IOException {
        /*
         *           
         */
        // 1.      DatagramSocket,    
        DatagramSocket socket = new DatagramSocket(8800);
        // 2.     ,            
        byte[] data = new byte[1024];//       ,           
        DatagramPacket packet = new DatagramPacket(data, data.length);
        // 3.          
        System.out.println("****        ,         ");
        socket.receive(packet);//                  
        // 4.    
        String info = new String(data, 0, packet.getLength());
        System.out.println("     ,    :" + info);

        /*
         *         
         */
        // 1.        、   、  
        InetAddress address = packet.getAddress();
        int port = packet.getPort();
        byte[] data2 = "   !".getBytes();
        // 2.     ,         
        DatagramPacket packet2 = new DatagramPacket(data2, data2.length, address, port);
        // 3.     
        socket.send(packet2);
        // 4.    
        socket.close();
    }
}

クライアント:
/*
 *    
 */
public class UDPClient {
    public static void main(String[] args) throws IOException {
        /*
         *          
         */
        // 1.        、   、  
        InetAddress address = InetAddress.getByName("localhost");
        int port = 8800;
        byte[] data = "   :admin;  :123".getBytes();
        // 2.     ,         
        DatagramPacket packet = new DatagramPacket(data, data.length, address, port);
        // 3.  DatagramSocket  
        DatagramSocket socket = new DatagramSocket();
        // 4.          
        socket.send(packet);

        /*
         *            
         */
        // 1.     ,             
        byte[] data2 = new byte[1024];
        DatagramPacket packet2 = new DatagramPacket(data2, data2.length);
        // 2.          
        socket.receive(packet2);
        // 3.    
        String reply = new String(data2, 0, packet2.getLength());
        System.out.println("     ,    :" + reply);
        // 4.    
        socket.close();
    }
}
完!!!