以下用UDP发送对象展示用户登录逻辑,代码如下:
服务端代码:
public class UDPServiceObject {
public static void main(String[] args) throws ClassNotFoundException {
try {
//创建服务端DatagramSocket并指定接口
DatagramSocket socket = new DatagramSocket(8888);
//创建数据报,用于接收从客户端发送过来的数据
byte[] data = new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(data, data.length);
System.out.println("******I am is Service, wait Client input.******");
//接收客户端发送的数据
socket.receive(datagramPacket);
//System.out.println("=====" + new String(datagramPacket.getData()));
ByteArrayInputStream bInputStream = new ByteArrayInputStream(data);
ObjectInputStream oStream =new ObjectInputStream(bInputStream);
User user = (User) oStream.readObject();
System.out.println("client say username:"+user.getUsername()+", password:"+user.getPassword());
//回复客户端对象
//组装回复的数据
ByteArrayOutputStream bOutputStream = new ByteArrayOutputStream();
ObjectOutputStream outputStream = new ObjectOutputStream(bOutputStream);
Result result = new Result(1, "login sucess.");
outputStream.writeObject(result);
byte[] outputData = new byte[1024];
outputData = bOutputStream.toByteArray();
outputStream.close();
bOutputStream.close();
//回复客户端消息
//System.out.println("hostAddress:"+socket.getInetAddress());
InetAddress address = datagramPacket.getAddress();
int port = datagramPacket.getPort();
System.out.println("address:"+address.getHostName()+",port:"+port);
DatagramPacket packet = new DatagramPacket(outputData, outputData.length, address, port);
//发送回复内容
socket.send(packet);
System.out.println("reply Client success.");
} catch (SocketException e) {
e.printStackTrace();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
客户端代码:
public class UDPClientObject {
public static void main(String[] args) throws ClassNotFoundException {
try {
User user = new User("admin","123456");
//此类实现了一个输出流,其中的数据被写入一个 byte 数组。缓冲区会随着数据的不断写入而自动增长。
//可使用 toByteArray() 和 toString() 获取数据
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
ObjectOutputStream stream = new ObjectOutputStream(byteArrayOutputStream);
stream.writeObject(user);
stream.flush();
stream.close();
byte[] data = new byte[1024];
data = byteArrayOutputStream.toByteArray();
byteArrayOutputStream.close();
//创建DatagramPacket,饮食将要发送的信息,包含发送的ip地址和端口号
InetAddress address = InetAddress.getByName("localhost");
int prot = 8888;
DatagramPacket packet = new DatagramPacket(data,data.length,address,prot);
//创建DatagramSocket
DatagramSocket socket = new DatagramSocket();
//发送报文内容
socket.send(packet);
System.out.println("*******I am is Client, send success.*******");
//接收服务端返回的响应内容
//System.out.println("port1:"+packet.getPort()+", port2:"+socket.getPort()+",port3:"+socket.getLocalPort());
//创建接收的pcket
byte[] replyData = new byte[1024];
DatagramPacket packet2 = new DatagramPacket(replyData,replyData.length);
socket.receive(packet2);
//System.out.println("=====" + new String(packet2.getData()));
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(replyData);
ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);
Result result = (Result)objectInputStream.readObject();
System.out.println("Service say code:"+result.getCode()+",message:"+result.getMessage());
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
两个实体类:
user.java
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private String username;
private String password;
public User(String username, String password) {
super();
this.username = username;
this.password = password;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
result.java
public class Result implements Serializable {
private int code;
private String message;
public Result(int code, String message) {
super();
this.code = code;
this.message = message;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
执行效果: