实验课上测试的源码。
1)服务器端
- import java.io.*;
- import java.net.*;
- //服务器端
- public class UDPServerTest {
- static public void main(String args[]) {
- DatagramSocket receiveSocket = null;
- try {
- //DatagramSocket(int port):创建实例,并固定监听Port端口的报文。通常用于服务端
- receiveSocket = new DatagramSocket(55511);
- byte buf[] = new byte[1000];
- //DatagramPacket(byte[] buf, int length):将数据包中Length长的数据装进Buf数组,一般用来接收客户端发送的数据。
- DatagramPacket receivePacket = new DatagramPacket(buf, buf.length);
- System.out.println("开始接受数据:");
- boolean flag = true; //作为接收完之后退出的标记
- while (flag) {
- //接收数据报文到d中。receive方法产生一个“阻塞”。“阻塞”是一个专业名词,它会产生一个内部循环,
- //使程序暂停在这个地方,直到一个条件触发。
- receiveSocket.receive(receivePacket);
- String name = receivePacket.getAddress().toString();
- System.out.println("/n来自主机:" + name + "/n端口:"
- + receivePacket.getPort());
- //从实例中取得报文的Byte数组编码
- String s = new String(receivePacket.getData(), 0, receivePacket
- .getLength());
- System.out.println("接受到的数据是: " + s);
- flag = false;
- //需关闭连接,也关闭端口。
- receiveSocket.close();
- }
- } catch (SocketException e) {
- receiveSocket.close();
- e.printStackTrace();
- System.exit(-1);
- } catch (IOException e) {
- receiveSocket.close();
- System.out.println("网络通讯出现错误,问题在" + e.toString());
- }
- }
- }
2)客户端
- import java.io.*;
- import java.net.*;
- //客户端
- public class UDPClientTest {
- public static void main(String args[]) {
- DatagramSocket sendSocket = null;
- try {
- //DatagramSocket():通常用于客户端编程,它并没有特定监听的端口,仅仅使用一个临时的。程序会让操作系统分配一个可用的端口。
- // DatagramSocket(int port):创建实例,并固定监听Port端口的报文。通常用于服务端
- sendSocket = new DatagramSocket();
- String string = "who a u 没死过,不知道dead的感觉";
- byte[] databyte = new byte[100];
- databyte = string.getBytes();
- //从Buf数组中,取出Length长的数据创建数据包对象,目标是clientAddress地址,clientPort端口,通常用来发送数据给客户端。 此处事发送给服务器端
- DatagramPacket sendPacket = new DatagramPacket(databyte,
- databyte.length, InetAddress.getByName("222.17.97.152"),
- 55511);
- //发送报文sendPacket到目的地
- sendSocket.send(sendPacket);
- System.out.println("客户端开始传送数据!");
- sendSocket.close();
- } catch (SocketException e) {
- sendSocket.close();
- e.printStackTrace();
- System.out.println("不能打开数据报Socket,或数据报Socket无法与指定端口连接!");
- } catch (IOException ioe) {
- sendSocket.close();
- System.out.println(ioe.toString());
- }
- }
- }
总结:异常或正常退出时,最好调用close方法,否则可能造成资源无法收回。