用户数据报协议(UDP)由Java软件的DatagramSocket和DatagramPacket类支持。包是自包含的消息,它包括有关发送方、消息长度和消息自身。
下面两个类是其中比较重要的类,我拿出来说一下
1,DatagramPacket有两个构造函数:一个用来接收数据,另一个用来发送数据:DatagramPacket(byte [] recvBuf, int readLength):用来建立一个字节数组以接收UDP包。byte数组在传递给构造函数时是空的,而int值用来设定要读取的字节数(不能比数组的大小还大)。
DatagramPacket(byte [] sendBuf, int sendLength, InetAddress iaddr, int iport):用来建立将要传输的UDP包。sendLength 不应该比sendBuf字节数组的大小要大
2,DatagramSocket用来读写UDP包。这个类有三个构造函数,允许你指定要绑定的端口号和internet地址:DatagramSocket()-绑定本地主机的所有可用端口。DatagramSocket(int port)-绑定本地主机的指定端口。DatagramSocket(int port, InetAddress iaddr)-绑定指定地址的指定端口。
UDP服务器端代码的实现:
UDP服务器在8888端口监听客户的请求。当它从客户接收到一个DatagramPacket时,它发送服务器上的当前时间。
import java.io.*;
import java.net.*;
import java.util.*;
public class UdpServer{
public byte[] getTime(){
Date d= new Date();
return d.toString().getBytes();
}
public void go() throws IOException {
DatagramSocket datagramSocket;
DatagramPacket inDataPacket;
DatagramPacket outDataPacket;
InetAddress clientAddress;
int clientPort;
byte[] msg= new byte[10];
byte[] time;
datagramSocket = new DatagramSocket(8888);
while(true) {
inDataPacket = new DatagramPacket(msg, msg.length);
datagramSocket.receive(inDataPacket);
clientAddress = inDataPacket.getAddress();
clientPort = inDataPacket.getPort();
time = getTime();
outDataPacket = new DatagramPacket
(time, time.length, clientAddress, clientPort);
datagramSocket.send(outDataPacket);
}
}
public static void main(String args[]) {
UdpServer udpServer = new UdpServer();
try {
udpServer.go();
} catch (IOException e) {
System.out.println (e);
System.exit(1);
}
}
}
UDP客户端代码的实现:
---end--
UDP客户向前面创建的客户发送一个空包并接收一个包含服务器实际时间的包。
import java.io.*;
import java.net.*;
public class UdpClient {
public void go() throws IOException, UnknownHostException {
DatagramSocket datagramSocket;
DatagramPacket outDataPacket;
DatagramPacket inDataPacket;
InetAddress serverAddress;
byte[] msg = new byte[1000];
String receivedMsg;
datagramSocket = new DatagramSocket();
serverAddress = InetAddress.getLocalHost(); .
outDataPacket = new DatagramPacket(msg, 1, serverAddress, 8888);
datagramSocket.send(outDataPacket);
inDataPacket = new DatagramPacket(msg, msg.length);
datagramSocket.receive(inDataPacket);
receivedMsg = new String
(inDataPacket.getData(), 0, inDataPacket.getLength());
System.out.println(receivedMsg);
datagramSocket.close();
}
public static void main(String args[]) {
UdpClient udpClient = new UdpClient();
try {
udpClient.go();
} catch (Exception e) {
System.out.println (e);
System.exit(1);
}
}
}