Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android和Java乒乓/乒乓Web套接字功能_Android_Java Websocket - Fatal编程技术网

Android和Java乒乓/乒乓Web套接字功能

Android和Java乒乓/乒乓Web套接字功能,android,java-websocket,Android,Java Websocket,我已经开发了一个Android应用程序,它正在连接JavaWebSocket,基本上运行得很好。 问题是,有时客户端断开连接,但服务器端的连接似乎已连接 我试图调查它发生的时间和原因,但不幸的是,我找不到导致此问题的特定场景 我曾想过在服务器和所有客户端之间实现Ping/Pong消息传递,如果客户端没有应答,则关闭服务器端的连接 我可以很容易地实现这样的私有机制,但我已经阅读了很多资料,我知道Java和Android有内置的乒乓球消息传递机制,但我没有找到任何这样的例子 无论如何,能否提供一个简

我已经开发了一个Android应用程序,它正在连接JavaWebSocket,基本上运行得很好。 问题是,有时客户端断开连接,但服务器端的连接似乎已连接

我试图调查它发生的时间和原因,但不幸的是,我找不到导致此问题的特定场景

我曾想过在服务器和所有客户端之间实现Ping/Pong消息传递,如果客户端没有应答,则关闭服务器端的连接

我可以很容易地实现这样的私有机制,但我已经阅读了很多资料,我知道Java和Android有内置的乒乓球消息传递机制,但我没有找到任何这样的例子


无论如何,能否提供一个简单的示例,说明如何使用内置工具实现乒乓球消息功能?

我已经成功地在EE JAVA WebSocket和android应用程序之间实现了乒乓球功能。服务器每5分钟向客户端发送一次Ping消息。如果服务器在5秒内未收到Pong消息,则服务器将关闭客户端连接

如果有人需要,以下是我的解决方案:

腹板箱侧:

public class User {
    public ScheduledExecutorService pingExecutorService;
    public Timer disconnectTimer;
    private Session userSession;
    private String userName;

    public User(Session userSession) {
        this.userSession = userSession;
    }

    public Session getUserSession() {
        return userSession;
    }

    public void setUserSession(Session userSession) {
        this.userSession = userSession;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }
}

@OnOpen
public void onOpen(Session session) {
    User newUserConnection = new User(session);
    connections.getConnections().put(session.getId(), newUserConnection);
    schedulePingMessages(newUserConnection);
}

@OnClose
public void onClose(Session session) {
    handleOnClose(session);
}

@OnMessage
public void onMessage(String message, Session session) {
    messageHandler.handleMessage(message, session);
}

@OnMessage
public void onPong(PongMessage pongMessage, Session session) {
    String sourceSessionId = session.getId();
    User user = connections.getConnections().get(sourceSessionId);
    user.disconnectTimer.cancel();
    user.disconnectTimer.purge();
}

@OnError
public void onError(Throwable t) {
    System.out.println(new Date() + "onError::" + t.getMessage());
    t.printStackTrace();
}

private void schedulePingMessages(User newUserConnection) {
    newUserConnection.pingExecutorService = Executors.newScheduledThreadPool(1);
    newUserConnection.pingExecutorService.scheduleAtFixedRate(() -> {
        scheduleDiconnection(newUserConnection);
        try {
            String data = "Ping";
            ByteBuffer payload = ByteBuffer.wrap(data.getBytes());
            newUserConnection.getUserSession().getBasicRemote().sendPing(payload);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }, 300, 300, TimeUnit.SECONDS);
}

private void scheduleDiconnection(User user) {
    user.disconnectTimer = new Timer();
    user.disconnectTimer.schedule(new TimerTask() {
        @Override
        public void run() {
            try {
                user.getUserSession().close(new CloseReason(CloseCodes.UNEXPECTED_CONDITION," Client does not response"));
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }, 5000);
}
android端只需添加以下覆盖方法:

    @Override
    public void onWebsocketPing(WebSocket conn, Framedata f) {
        Log.i("ZCF","got Ping !");
        super.onWebsocketPing(conn, f);
    }
搜索“javawebsocketheartbeat”,有许多结果可以解决您的问题。