当前位置: 首页 > 知识库问答 >
问题:

Android和Java乒乓网络套接字功能

范哲
2023-03-14

我已经开发了Android应用程序,并且连接到JAVA Web Socket,基本上它运行得很好。问题是,有时客户端断开连接,但服务器端的连接似乎已连接。

我试图调查它发生的时间和原因,但不幸的是,我找不到导致这个问题的具体情况。

我想在服务器和所有客户端之间实现乒乓消息,如果客户端没有响应,就关闭服务器端的连接。

我可以很容易地实现这样的我的私人机制,但我已经阅读了周围,我知道Java和Android有一个建立在乒乓/乒乓消息传递机制,但我无法找到任何例子。

能否提供一个简单的例子,说明如何使用内置工具实现Ping/Pong消息传递功能?

共有1个答案

钱选
2023-03-14

我已经成功实现了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);
    }
 类似资料:
  • 计算机网络基础 ip地址 为了使网络上的计算机能够彼此识别对方,每台计算机都需要一个IP地址以标识自己。 IPv4:32位,IPv6:64位 OSI七层参考模型 应用层 表示层 会话层 传输层 网络层 数据链路层 物理层 地址解析 地址解析是指将计算机的协议地址解析为物理地址,即MAC(Medium Access Control)地址,又称为媒体访问控制地址。通常,在网络上由地址解析协议(ARP)

  • 问题内容: 我已经使用创建了服务器。之后,我使用创建了Client ,并连接到该服务器。 之后,我对InputStream和OutputStream进行了“一些处理”,它们是从Socket Object中获取的。但是,我不太了解inputStream和outputStream。这是我的简单代码: 结果将是:“ Hello World”和“ Hello StackOverFlow”。 这是服务器端代

  • 我使用创建了一个服务器。之后,我使用创建了客户机,并连接到该服务器。 之后,我对InputStream做了“一些事情”,而OutputStream是从套接字对象中获取的。但是,我不太理解inputStream和outputStream。下面是我的简单代码: 结果将是:“Hello World”和“Hello StackOverflow”。 以下是服务器端代码: 我的问题是: > 当我使用时,我可以

  • 本文向大家介绍Java套接字(Socket)网络编程入门,包括了Java套接字(Socket)网络编程入门的使用技巧和注意事项,需要的朋友参考一下 网络应用模式主要有: 主机/终端模式:集中计算,集中管理; 客户机/服务器(Client/Server,简称C/S)模式:分布计算,分布管理; 浏览器/服务器模式:利用Internet跨平台。 www(万维网)就是建立在客户机/服务器模式上,以HTML

  • 我正在考虑将Netty用于我的第一层美国银行算法交易项目。然而,我找不到任何简单乒乓TCP测试的性能数字: 客户端向服务器发送64字节的消息 服务器接收消息并发送回客户端 客户端计算往返的延迟时间 我知道EPoll forLinux是最快的NIO实现。 我的问题是:Netty在4Ghz处理器上往返发送64字节消息的平均时间、最短时间和最长时间是多少?我将首先测试本地主机/环回。

  • 根据https://tools.ietf.org/html/rfc6455#page-37中的文档,必须使用响应请求。 我已经实现了来处理来自客户端的连接。 我对此有疑问- 我是否必须在中处理这些请求? 如果是,如何在spring boot应用程序中实现此功能,并使用响应请求?