记录Java使用websocket

实现场景:每在小程序中添加一条数据时,后台将主动推送一个标记给PC端,PC端接收到标记将进行自动播放音频。

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;

@Configuration
public class WebSocketConfig {
    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
        return new ServerEndpointExporter();
    }
}
import org.springframework.stereotype.Component;

import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.concurrent.CopyOnWriteArraySet;

@Component
@ServerEndpoint("/websocket")
public class WebSocketServer {


    private static final CopyOnWriteArraySet<WebSocketServer> connections = new CopyOnWriteArraySet<>();
    private Session session;

    @OnOpen
    public void onOpen(Session session) {
        this.session = session;
        connections.add(this);
        this.sendMessage("0");
    }

    @OnClose
    public void onClose() {
        connections.remove(this);
        System.out.println("连接关闭: " + session.getId());
    }

    @OnError
    public void onError(Throwable error) {
        System.out.println("错误信息:"+error.getMessage());
        error.printStackTrace();
    }

    private void sendMessage(String message) {
        try {
            this.session.getBasicRemote().sendText(message);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void broadcast(String message) {
        for (WebSocketServer client : connections) {
            client.sendMessage(message);
        }
    }

}
@Override
    public void addUser(req req) {
        QueryWrapper<User> userWrapper = new QueryWrapper<>();
        userWrapper .eq("name",req.getName());
        User u = userMapper.selectOne(userWrapper);
        if (u == null){
            WebSocketServer.broadcast("1");
        }
    }

每次小程序调用 addUser() 方法时,都会执行 WebSocketServer.broadcast("1"); 这时候触发主动推送消息给PC端。


遇到的问题:

         Error during WebSocket handshske: Unexpected response code: 200

解决方案:

        本地项目中存在账号密码验证的过滤器,其中 /websocket 进行了转发,所以需要过滤请求

 

重新启动项目即可。 


部署到线上的操作:websocket的地址(wss://xxx.com/api/websocket

        其中 /api/websocket为自己项目中的websocket的接口地址

1.修改ws的地址 -> 将本地IP修改为线上域名

2.修改nginx

3.PC端进行访问并且查看日志,是否连接成功

出现的问题:

1.Error during WebSocket handshake: Unexpected response code: 301

        域名为 https ,需要将 ws 修改为 wss 

2.Error during WebSocket handshake: Unexpected response code: 404

        nginx 里面对当前域名进行 websocket 配置

        参考地址:https://www.cnblogs.com/cnsyear/p/12635301.html

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的。 在 Java 中实现 WebSocket 定时发送消息,你需要用到一个定时任务的库,比如说 `java.util.Timer` 或者 `java.util.concurrent.ScheduledThreadPoolExecutor`。这些库都可以实现定时执行某个任务的功能。 下面是一个简单的例子,使用 `java.util.Timer` 实现 WebSocket 定时发送消息: ``` import java.util.Timer; import java.util.TimerTask; import javax.websocket.Session; public class MyWebSocket { // 定时任务 private static Timer timer = new Timer(); // WebSocket 会话 private Session session; public MyWebSocket(Session session) { this.session = session; } public void startTimer() { // 定义定时任务 TimerTask task = new TimerTask() { @Override public void run() { try { // 发送消息 session.getBasicRemote().sendText("定时发送的消息"); } catch (Exception e) { // 异常处理 } } }; // 开始定时任务,每隔 5 秒执行一次 timer.schedule(task, 0, 5000); } public void stopTimer() { // 停止定时任务 timer.cancel(); } } ``` 这样,你就可以在你的 WebSocket 服务端代码中,调用 `startTimer` 方法来启动定时任务,调用 `stopTimer` 方法来停止定时任务。 希望这能帮到你。 ### 回答2: 要实现 Java 中的 WebSocket 定时发送消息,可以使用以下步骤: 1. 首先,需要导入 JavaWebSocket 相关的库。可以使用 Java EE 提供的 javax.websocket 包。 2. 创建一个 WebSocket 的类,该类需要继承 javax.websocket.Endpoint 类。在该类中,需要实现 onOpen、onClose、onMessage 和 onError 方法。 3. 在 onOpen 方法中,可以进行一些初始化操作,比如建立数据库连接等。 4. 在 onMessage 方法中,可以处理接收到的客户端消息。 5. 在 onClose 方法中,可以进行资源释放操作,比如关闭数据库连接。 6. 在 onError 方法中,可以处理发生的错误,比如日志记录等。 7. 在类中添加一个定时任务,使用 java.util.Timer 或者 java.util.concurrent.ScheduledExecutorService 类来执行定时任务。 8. 在定时任务中,使用 javax.websocket.Session 的 getBasicRemote 方法获取到 BasicRemote 对象,然后使用 BasicRemote 对象的 sendText 方法发送消息给客户端。 9. 使用 javax.websocket.server.ServerEndpoint 注解来指定 WebSocket 的路径和配置。 10. 在应用程序的入口类中,使用 javax.websocket.server.ServerContainer 的 addEndpoint 方法将创建的 WebSocket 类添加到容器中。 11. 部署应用程序,并启动服务器。 通过以上步骤,就可以实现 Java 中的 WebSocket 定时发送消息了。每当定时任务触发时,就可以向客户端发送指定的消息。 ### 回答3: 在Java中实现WebSocket定时发送消息的步骤如下: 1. 导入相关的包: import javax.websocket.ContainerProvider; import javax.websocket.DeploymentException; import javax.websocket.Session; import javax.websocket.WebSocketContainer; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; 2. 创建WebSocketClient类,实现Endpoint接口,并重写onOpen、onClose和onError方法: public class WebSocketClient extends Endpoint { private Session session; @Override public void onOpen(Session session, EndpointConfig config) { this.session = session; } @Override public void onClose(Session session, CloseReason closeReason) { // 处理关闭连接的逻辑 } @Override public void onError(Session session, Throwable throwable) { // 处理错误的逻辑 } public void sendMessage(String message) throws IOException { session.getBasicRemote().sendText(message); } } 3. 创建WebSocketServer类,用于启动WebSocket客户端并定时发送消息: public class WebSocketServer { public static void main(String[] args) throws IOException, InterruptedException, URISyntaxException, DeploymentException { WebSocketContainer container = ContainerProvider.getWebSocketContainer(); Session session = container.connectToServer(WebSocketClient.class, new URI("wss://example.com")); // 修改为实际的WebSocket服务器地址 // 每隔1秒发送一次消息 Timer timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { try { ((WebSocketClient) session).sendMessage("Hello, WebSocket!"); // 修改为实际需要发送的消息 } catch (IOException e) { e.printStackTrace(); } } }, 0, 1000); // 持续运行 Thread.sleep(Long.MAX_VALUE); } } 以上代码假设WebSocket服务器的地址为"wss://example.com",每隔1秒发送一次消息"Hello, WebSocket!"。可以根据实际需求修改相应的地址和消息内容。 请注意,WebSocket是一种双向通信协议,需要安装WebSocket服务器并编写相应的服务器端代码来接收和处理消息。以上代码只是实现了客户端的发送功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值