方法一:客户端将每个数据逐条打包发送,服务器逐个接收每条数据,UDP只能转发字节型数据,所以需要转发其他类型的数据时需要进行强制类型转换。
客户端实例代码:
package UDP;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Scanner;
public class Client {
public static void main(String[] args) throws IOException {
DatagramSocket ds = new DatagramSocket();
@SuppressWarnings("resource")
Scanner inputs = new Scanner(System.in);
while(true)
{
String s = inputs.nextLine();
byte[] bys = s.getBytes();
int length = bys.length;
InetAddress address = InetAddress.getByName("DESKTOP-H1RVE5U");
int port = 8888;
DatagramPacket dp = new DatagramPacket(bys,length,address,port);
ds.send(dp);
}
// ds.close();
}
}
服务器实例代码:
package UDP;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class Server {
public static void main(String[] args) throws IOException {
//创建接收端Socket对象
DatagramSocket ds = new DatagramSocket(8888);
//DatagramSocket ds = new DatagramSocket(8888);
byte[] bys = new byte[1024];
DatagramPacket dp = new DatagramPacket(bys,bys.length);
//System.out.println(1);
while(true)
{
ds.receive(dp);//阻塞
//wSystem.out.println(2);
//解析数据
//InetAddress getAddress() : 获取发送端的IP对象
InetAddress address = dp.getAddress();
//byte[] getData() :获取接收到的数据,也可以直接使用创建包对象时的数组
byte[] data = dp.getData();
//int getLength() :获取具体收到数据的长度
int length = dp.getLength();
//输出数据
System.out.println("sender ---> " + address.getHostAddress());
System.out.println("sender ---> " + dp.getPort());
System.out.println(new String(data,0,length));
}
//释放资源
// ds.close();
}
}
方法二:客户端将所以需要发送的多个数据利用空格区分,一起打包发送给服务器端,服务器端接收到数据后根据空格进行数据拆分,同时也会用到各种数据的强制类型转换。
客户端实例代码:
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;
public class Client {
public static void main(String[] args) throws IOException {
DatagramSocket ds = new DatagramSocket();
@SuppressWarnings("resource")
int x = 100,y=100;
String s = "button1" + " " + String.valueOf(x) + " " + String.valueOf(y);
byte[] bys = s.getBytes();
int length = bys.length;
InetAddress address = InetAddress.getByName("127.0.0.1");
int port = 8888;
DatagramPacket dp = new DatagramPacket(bys,length,address,port);
ds.send(dp);
ds.close();
}
}
服务器实例代码:
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.StringTokenizer;
public class Server {
public static void main(String[] args) throws IOException {
//创建接收端Socket对象
DatagramSocket ds = new DatagramSocket(8888);
int x ,y;
//DatagramSocket ds = new DatagramSocket(8888);
byte[] bys = new byte[1024];
DatagramPacket dp = new DatagramPacket(bys,bys.length);
ds.receive(dp);//阻塞
InetAddress address = dp.getAddress();
byte[] data = dp.getData();
int length = dp.getLength();
String cin;
cin = new String(data,0,length);
System.out.println("sender ---> " + address.getHostAddress());
System.out.println(new String(data,0,length));
StringTokenizer scin = new StringTokenizer(cin, " ");
String orderStr = scin.nextToken();//接受指令
String X = scin.nextToken();
x = Integer.valueOf(X);
String Y = scin.nextToken();
y = Integer.valueOf(Y);
int a = 3;
if(orderStr.equals("BUTTON1"))
a = 1;
switch (a){
case 1:
System.out.println("画圆"+"X= "+x+"Y= "+y);
break;
case 3:
{
System.out.println("方块"+"X= "+x+"Y= "+y);
break;
}
}
//释放资源
ds.close();
}
}