在与别的服务器进行通信的过程中,我们一般是通过UDP或TCP连接,往服务器的指定IP地址和端口发送消息,然后监听与服务器连接时指定的接收信息的端口,但是这样就是异步通信了,我们还需要使用WebSocket往前端页面推送消息,这时就产生了如下的需求:
同步发送和接受消息,这样一个Ajax请求就可以实现发送和接收信息,且不需要指定接收返回信息的端口,服务器原路返回即可。
而TCP连接一定是异步的,所以只能使用UDP连接,且使用UDP连接还可以使项目在需要用的时候才连接,不用一直保持连接状态,节省资源。
代码如下:
<!-- 字符串转JSON对象 -->
<!-- 第一种写法依赖 -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.9</version>
</dependency>
<!-- 第二种写法依赖 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.78</version>
</dependency>
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
public class UdpClass {
/**
* UDP发送并接收消息
* @param ipAddress IP地址
* @param port 端口号
* @param message 消息
*/
public static String UdpClient(String ipAddress, Integer port, String message) {
String receiveStr = "";
try {
DatagramSocket datagramSocket = new DatagramSocket();
// 设置超时时间
datagramSocket.setSoTimeout(5000);
byte[] buf = message.getBytes();
InetAddress address = InetAddress.getByName(ipAddress);
// 封装一个数据包
DatagramPacket datagramPacket = new DatagramPacket(buf, buf.length, address, port);
datagramSocket.send(datagramPacket);
// 接收返回数据
byte[] receiveBuf = new byte[1024000];
DatagramPacket receivePacket = new DatagramPacket(receiveBuf, receiveBuf.length);
datagramSocket.receive(receivePacket);
receiveStr = new String(receivePacket.getData(), 0, receivePacket.getLength());
datagramSocket.close();
} catch (Exception e) {
throw new ParameterException(1001, "消息发送失败");
}
return receiveStr;
}
/**
* 解析接收信息
* @param receiveStr 接收信息
*/
public static void sendMessage(String receiveStr) {
// 使receiveStr变成JSON对象格式,例如:{"RES": 0}
receiveStr = "{" + receiveStr + "}";
// 第一种写法
Gson gson = new Gson();
JSONObject jsonObject = new JSONObject();
jsonObject = gson.fromJson(receiveStr, jsonObject.getClass());
String res = jsonObject.get("RES");
// 第二种写法
// JSONObject jsonObject = JSON.parseObject(receiveStr);
// String res = jsonObject.getString("RES");
System.out.println(res);
}
}