信息处理接口,定义了信息的关闭,发送,和接收
public interface MessageAction { void sendMessage(); void receiveMessage(); void close(); }
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() { }
/** * 发送数据包 */ @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(); }
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(); } }
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,检查程序结果便可