java中请给出UDP的DatagramSocket通信的例子

UDP(数据报)协议的通信实例
马克-to-win:在UDP编程当中,技术上没有一个服务器和客户端的概念,即没有类似于TCP中的ServerSocket类,只有主动和被动之说,客户端和服务器都用DatagramSocket(MyPORT)来绑定到一个端口,发送和接收dataPacket,它们是对等的双方。不过通常来讲,先发送数据的被认为是客户端。in UDP, there is no concept of server or client, only active and passive, client and server both use new DatagramSocket(MyPORT) to bind to a port to use the port to send and receive the dataPacket, the counterpart which initially send the dataPacket is deemed as the client.  unlike the TCP protocol, there, there is really ServerSocket.
马克- to-win:马克 java社区:防盗版实名手机尾号: 73203。
UDP通信主要有两个类,DatagramPacket是数据容器,它携带自己来自何处,以及打算去哪里的信息。DatagramSocket用来发送或接收DatagramPacket。
DatagramPacket不仅需要包含正式的数据,也要包含网络地址以及端口号,以决定它的目的地。



例:2.3.1(客户端写,服务器端读)

服务器端:

import java.net.*;
import java.io.*;
import java.util.*;
public class TestMark_to_win {
    static final int MyPORT = 1711;
    public static void main(String[] args) throws IOException {
        byte[] bufreceive = new byte[1000];
        DatagramPacket packetreceive = new DatagramPacket(bufreceive,
                bufreceive.length);//测试结果bufreceive.length是1000
        DatagramSocket socket;
        socket = new DatagramSocket(MyPORT);
        // Block until a datagram appears:
        socket.receive(packetreceive);
        String stringreceive = new String(packetreceive.getData(), 0,
                packetreceive.getLength());
        System.out.println(stringreceive);
        socket.close();
    }
}

客户端程序:
import java.net.*;
import java.io.*;
import java.util.*;
public class Test {
    static final int MyPORT = 1710;
    static final int SERVERPORT = 1711;
    public static void main(String[] args) throws IOException {
        byte[] bufsend = new byte[1000];
        DatagramSocket client;
        InetAddress destination = InetAddress.getByName("localhost");
        client = new DatagramSocket(MyPORT);
        bufsend = "java study".getBytes();// string encode to a byte array
        DatagramPacket sendpacket = new DatagramPacket(bufsend, bufsend.length,
                destination, SERVERPORT);
        client.send(sendpacket);
        client.close();
    }
}

服务器端输出:
java study





例:2.3.2(客户端无限读写,服务器端也无限读写)

import java.net.*;
import java.io.*;
import java.util.*;
public class TestMark_to_win {
    static final int MyPORT = 1711;
    public static void main(String[] args) throws IOException {
        byte[] bufreceive = new byte[1000];
        byte[] bufsend = new byte[1000];
        /* public DatagramPacket(byte[] buf,int length) Constructs a
DatagramPacket for receiving packets of length length. The length
argument must be less than or equal to buf.length.
         */
        DatagramPacket packetreceive = new DatagramPacket(bufreceive,
                bufreceive.length);
        // Can listen & send on the same socket:
        /*
         * Datagram packets are used to implement a connectionless packet
         * delivery service.
         */
        DatagramSocket socket;

        /*
         * This class represents a socket for sending and receiving datagram
         * packets. A datagram socket is the sending or receiving point for a
         * packet delivery service. DatagramSocket(MyPORT): Constructs a
         * datagram socket and binds it to the specified port on the local host
         * machine.
         */
        socket = new DatagramSocket(MyPORT);
        while (true) {
            /*
             * Receives a datagram packet from this socket. When this method
             * returns, the DatagramPacket's buffer is filled with the data
             * received. Block until a datagram appears:
             */
            socket.receive(packetreceive);
            /* public byte[] getData()Returns the data buffer. public int
             * getLength() Returns the length of the data to be sent or the
             * length of the data received.
             *
             * public String(byte[] bytes,int offset,int length) Constructs a
             * new String by decoding the specified subarray of bytes using the
             * platform's default charset.
             */
            String stringreceive = new String(packetreceive.getData(), 0,
                    packetreceive.getLength());
            System.out.println(stringreceive);
            stringreceive = stringreceive + "coming back from server";
            /*
             * public byte[] getBytes() Encodes this String into a sequence of
             * bytes using the platform's default charset, storing the result
             * into a new byte array.
             */
            bufsend = stringreceive.getBytes();
            /*
             * public DatagramPacket(byte[] buf,int length,InetAddress
             * address,int port) Constructs a datagram packet for sending
             * packets of length length to the specified port number on the
             * specified host. The length argument must be less than or equal to
             * buf.length.
             *
             * public InetAddress getAddress() Returns the IP address of the
             * machine to which this datagram is being sent or from which the
             * datagram was received. public int getPort() Returns the port
             * number on the remote host to which this datagram is being sent or
             * from which the datagram was received.
             */
            DatagramPacket echo = new DatagramPacket(bufsend, bufsend.length,
                    packetreceive.getAddress(), packetreceive.getPort());
            socket.send(echo);
        }
    }
}




以下是客户端程序:

import java.net.*;
import java.io.*;
import java.util.*;
public class Test {
    static final int MyPORT = 1710;
    static final int SERVERPORT = 1711;
    public static void main(String[] args) throws IOException {
        byte[] bufreceive = new byte[1000];
        byte[] bufsend = new byte[1000];
        DatagramPacket p = new DatagramPacket(bufreceive, bufreceive.length);
        DatagramSocket client;

        BufferedReader dis = new BufferedReader(
                new InputStreamReader(System.in));
        /* public static InetAddress getByName(String host) throws
         * UnknownHostException: Determines the IP address of a host, given the
         * host's name. The host name can either be a machine name, such as
         * "java.sun.com", or a textual representation of its IP address. If a
         * literal IP address is supplied, only the validity of the address
         * format is checked.
         */
        InetAddress destination = InetAddress.getByName("localhost");
        client = new DatagramSocket(MyPORT);

        while (true) {
            String str = dis.readLine();
            if (str.equals("end"))
                break;
            bufsend = str.getBytes();// string encode to a byte array
            DatagramPacket sendpacket = new DatagramPacket(bufsend,
                    bufsend.length, destination, SERVERPORT);  

        client.send(sendpacket);
            // Block until a datagram appears:
            client.receive(p);
            /* p.getData means return the data buffer of the packet,
             * String(byte[] bytes, int offset, int length)------ Constructs a
             * new String by decoding the specified subarray of bytes using the
             * platform's default charset.
             */
            String psx = new String(p.getData(), 0, p.getLength());
            System.out.println(psx);
        }
    }
}


客户端结果输出:(eclipse本身有bug,所以我只用英文实验)

java
javacoming back from server
study
studycoming back from server
end



服务器端结果输出:

java
study