Java实现UDP传输方式同步发送并接收消息

在与别的服务器进行通信的过程中,我们一般是通过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);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章