信息处理接口,定义了信息的关闭,发送,和接收
public interface MessageAction {
void sendMessage();
void receiveMessage();
void close();
}
Udp类实现了MessageAction封装了下面的信息,并提供了相应的get和set方法
private int sendPort;// 要发送数据的端口号端口号
private int localPort;// 本机端口号
InetAddress address = null;// 地址信息
DatagramSocket socket = null;
DatagramPacket receivePacket = null;// 接收用的数据包
DatagramPacket sendPacket = null;// 发送数据包
byte[] bytesToSend = new byte[255];// 要发送的字节数组
构造器如下
public Udp(int sendPort, InetAddress address, DatagramSocket socket,
byte[] bytesToSend) {
super();
this.sendPort = sendPort;
this.address = address;
this.socket = socket;
this.bytesToSend = bytesToSend;
}
public Udp(InetAddress address, DatagramSocket socket, byte[] bytesToSend) {
this.address = address;
this.socket = socket;
this.bytesToSend = bytesToSend;
}
public Udp(int sendPort, int localPort, InetAddress address,
DatagramSocket socket, DatagramPacket receivePacket,
DatagramPacket sendPacket, byte[] bytesToSend) {
super();
this.sendPort = sendPort;
this.localPort = localPort;
this.address = address;
this.socket = socket;
this.receivePacket = receivePacket;
this.sendPacket = sendPacket;
this.bytesToSend = bytesToSend;
}
public Udp() {
}
sendMessage和receiveMessage方法的实现如下
/**
* 发送数据包
*/
@Override
public void sendMessage() {
try {
//初始化发送的数据包
this.sendPacket = new DatagramPacket(this.bytesToSend,
this.bytesToSend.length, address, sendPort);
this.socket.send(sendPacket);//执行发送
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 接收数据包,把接收到的数据放入字节数组buf中,因为一般而言,
* 需要调用getOffset()和getData()方法来访问刚接收到的数据
* 如果直接调用getData()方法,该方法总是返回字节数组的原始大小,忽略了
* 实际数据的内部偏移量和长度信息,所以用到了buf来处理信息
*/
@Override
public void receiveMessage() {
try {
//初始化接收的数据包
this.receivePacket = new DatagramPacket(
new byte[this.bytesToSend.length], this.bytesToSend.length);
this.socket.receive(receivePacket);
//把接收到的数据放入字节数组buf中,因为一般而言,需要调用getOffset()和getData()方法来访问刚接收到的数据
byte[] buf = new byte[receivePacket.getLength()];
System.arraycopy(receivePacket.getData(),
receivePacket.getOffset(), buf, 0, buf.length);
String message = new String(buf);//用字节数组创造相应的字符串
System.out.println(message);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void close() {
this.socket.close();
}
下面是Udp的具体的子类UdpClient和UdpServer的具体的实现
public class UdpClient extends Udp {
public UdpClient() {
super();
// TODO Auto-generated constructor stub
}
public UdpClient(InetAddress address, DatagramSocket socket,
byte[] bytesToSend) {
super(address, socket, bytesToSend);
// TODO Auto-generated constructor stub
}
public UdpClient(int sendPort, InetAddress address, DatagramSocket socket,
byte[] bytesToSend) {
super(sendPort, address, socket, bytesToSend);
// TODO Auto-generated constructor stub
}
public UdpClient(int sendPort, int localPort, InetAddress address,
DatagramSocket socket, DatagramPacket receivePacket,
DatagramPacket sendPacket, byte[] bytesToSend) {
super(sendPort, localPort, address, socket, receivePacket, sendPacket,
bytesToSend);
// TODO Auto-generated constructor stub
}
public static void main(String args[]) throws UnknownHostException, SocketException {
Udp us = new UdpClient(InetAddress.getLocalHost(),
new DatagramSocket(8889), "我是客户端".getBytes());
us.setSendPort(8888);//设置要发送的端口号
us.sendMessage();
us.receiveMessage();
// us.close();
}
}
UdpServer
public class UdpServer extends Udp {
public static void main(String args[]) throws UnknownHostException, SocketException {
Udp us = new UdpServer(InetAddress.getLocalHost(),
new DatagramSocket(8888), "我是服务端".getBytes());
us.receiveMessage();//接收客户端的信息
us.setSendPort(8889);//设置要发送的端口号
us.sendMessage();
//us.close();
}
public UdpServer(InetAddress address, DatagramSocket socket,
byte[] bytesToSend) {
super(address, socket, bytesToSend);
// TODO Auto-generated constructor stub
}
public UdpServer() {
super();
// TODO Auto-generated constructor stub
}
public UdpServer(int port, InetAddress address, DatagramSocket socket,
byte[] bytesToSend) {
super(port, address, socket, bytesToSend);
// TODO Auto-generated constructor stub
}
}
在myeclipse里先运行UdpServer在运行UdpClient,检查程序结果便可