Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.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
Ratchet PHP服务器建立连接,但Kotlin从未收到确认_Kotlin_Websocket_Socket.io_Handshake_Ratchet - Fatal编程技术网

Ratchet PHP服务器建立连接,但Kotlin从未收到确认

Ratchet PHP服务器建立连接,但Kotlin从未收到确认,kotlin,websocket,socket.io,handshake,ratchet,Kotlin,Websocket,Socket.io,Handshake,Ratchet,我有一个ratchet服务器,我试图通过Websocket访问它。它类似于教程:在有新客户机或收到消息时进行日志记录。Ratchet服务器报告已成功建立连接,而Kotlin客户端未成功建立连接(Kotlin中的连接事件从未触发)。我正在使用socket io java模块v.2.0.1。客户端在指定的超时时间后显示超时,在服务器上分离,并在短时间后再次连接,就像它认为的那样,连接没有正确连接(因为缺少连接响应?) 如果客户端是Chrome的JS控制台中的Websocket客户端,则成功的连接确认

我有一个ratchet服务器,我试图通过Websocket访问它。它类似于教程:在有新客户机或收到消息时进行日志记录。Ratchet服务器报告已成功建立连接,而Kotlin客户端未成功建立连接(Kotlin中的连接事件从未触发)。我正在使用socket io java模块v.2.0.1。客户端在指定的超时时间后显示超时,在服务器上分离,并在短时间后再次连接,就像它认为的那样,连接没有正确连接(因为缺少连接响应?)

如果客户端是Chrome的JS控制台中的Websocket客户端,则成功的连接确认会报告给客户端,但不会报告给我的Kotlin应用程序。即使是在同一台计算机上运行的Android仿真器也不会得到响应(因此我认为问题与wi-fi无关)。 这种连接在JS上运行良好,完成了完整的握手,但在Android应用程序中,它只会到达服务器,而不会再次到达客户端

这是我的服务器代码:

<?php


namespace agroSMS\Websockets;


use Ratchet\ConnectionInterface;
use Ratchet\MessageComponentInterface;

class SocketConnection implements MessageComponentInterface
{
    protected \SplObjectStorage $clients;
    public function __construct() {
        $this->clients = new \SplObjectStorage;
    }

    function onOpen(ConnectionInterface $conn)
    {
        $this->clients->attach($conn);
        error_log("New client attached");
    }

    function onClose(ConnectionInterface $conn)
    {
        $this->clients->detach($conn);
        error_log("Client detached");
    }

    function onError(ConnectionInterface $conn, \Exception $e)
    {
        echo "An error has occurred: {$e->getMessage()}\n";

        $conn->close();
    }

    function onMessage(ConnectionInterface $from, $msg)
    {
        error_log("Received message: $msg");
        // TODO: Implement onMessage() method.
    }
}

甚至连服务器上都没有建立连接。因此,这次尝试更像是一次低谷。

我去socket.io-java-client的github页面寻找解决问题的方法,结果发现,整个问题是,我误解了一个非常重要的概念: io使用WebSocket并不意味着它与WebSocket兼容。 因此,用明确的话来说: 如果在客户端使用socket.io,则还需要在服务器端使用它,反之亦然。由于socket.io随数据包发送大量元数据,纯Websocket服务器将接受它们的连接建立,但socket.io客户端将不接受其返回的确认。 您必须选择full socket.io或full pure WebSocket

<?php

use Ratchet\Server\IoServer;
use agroSMS\Websockets\SocketConnection;
use Ratchet\WebSocket\WsServer;
use Ratchet\Http\HttpServer;

require dirname(__DIR__) . '/vendor/autoload.php';

$server = IoServer::factory(
    new HttpServer(
        new WsServer(
            new SocketConnection()
        )
    )
);

$server->run();
var conn = new WebSocket('ws://<my-ip>:80');
conn.onopen = function(e) {
    console.log("Connection established!");
};

conn.onmessage = function(e) {
    console.log(e.data);
};
try {
       val uri = URI.create("ws://<my-ip>:80")
       val options = IO.Options.builder()
                    .setTimeout(60000)
                    .setTransports(arrayOf(WebSocket.NAME))
                    .build()
       socket = IO.socket(uri, options)
       socket.connect()
                            .on(Socket.EVENT_CONNECT) {
                                Log.d(TAG, "[INFO] Connection established")
                                socket.send(jsonObject)
                            }
                            .once(Socket.EVENT_CONNECT_ERROR) {
                                val itString = gson.toJson(it)
                                Log.d(TAG, itString)
                            }
}catch(e : Exception) {
   Log.e(TAG, e.toString())
}
[{"cause":{"bytesTransferred":0,"detailMessage":"Read timed out","stackTrace":[],"suppressedExceptions":[]},"detailMessage":"websocket error","stackTrace":[],"suppressedExceptions":[]}]