Udp客户端:
选择绑定服务端的ip和端口,运行main方法,发送信息。
package test.client;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;
public class UdpClient {
private static DatagramSocket clientSocket = null;
private InetSocketAddress serverAddress = null;
public UdpClient(String host, int port) throws SocketException {
clientSocket = new DatagramSocket( ); //创建socket
serverAddress = new InetSocketAddress(host, port); //绑定sever的ip与port
}
public void send(String msg) throws IOException {
try {
byte[] data = msg.getBytes("utf-8");
DatagramPacket packet = new DatagramPacket(data, data.length, serverAddress);
clientSocket.send(packet);
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//main方法用于测试
public static void main(String[] args) throws Exception {
String str = "hello";
UdpClient client = new UdpClient("127.0.0.1", 8081);
System.out.println("发送数据:"+str);
client.send(str);
clientSocket.close();
System.out.println("发送数据结束,关闭socket");
}
}
Udp服务端:
main方法中绑定端口,运行main方法,等待接受数据。
package test.client;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class UdpServer {
private byte[] data = new byte[1024];
private static DatagramSocket serverSocket = null;
private DatagramPacket packet = null;
public UdpServer(int port) throws SocketException {
serverSocket = new DatagramSocket(port);
System.out.println("sever start!");
}
//接收消息
public String recieve() throws IOException {
packet = new DatagramPacket(data, data.length);
serverSocket.receive(packet);
String info = new String(packet.getData(), 0, packet.getLength());
System.out.println("recieve message from " + packet.getAddress().getHostAddress()
+ ":" + packet.getPort() + "\n"+ info);
return info;
}
//本地测试
public static void main(String[] args) throws Exception {
UdpServer server = new UdpServer(8081);
server.recieve();
}
}
先启动service:
运行client发送数据:
先前启动等待接受数据的service:
补充:
测试的时候发现一个问题,updservice运行main方法后,只能接受一次数据,运行就会停止,不方便测试。下面是让udpservice一直启动实时接收数据。
package test.client;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class UdpServer2 {
public static void main(String[] args) {
receiver();
}
public static void receiver() {
new Thread() {
@Override
public void run() {
System.out.println("Udp service 线程启动!");
// UDP接收端
DatagramSocket serverSocket = null;
DatagramPacket packet = null;
try {
//这里只需要设置端口,无需IP地址。其端口与发送端一致。
serverSocket = new DatagramSocket(8081);
byte[] data = new byte[1024];
packet = new DatagramPacket(data, data.length);
while (true) {
// 接收数据包
serverSocket.receive(packet);
String info = new String(packet.getData(), 0, packet.getLength());
System.out.println("recieve message from " + packet.getAddress().getHostAddress()
+ ":" + packet.getPort() + "\n"+ info);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (serverSocket != null) {
serverSocket.close();
}
}
}
}.start();
}
}
效果如下: