Android和IOS客户端的棘轮套接字

4

我编写了使用Ratchet的PHP套接字代码。这里是一个简单的代码,当我从网页 - JavaScript发送和接收消息时它可以工作:

    use Ratchet\MessageComponentInterface;

    class Chat implements MessageComponentInterface{
        protected $clients;

        public function __construct(){
            $this->clients = new SplObjectStorage();
        }

        function onOpen(\Ratchet\ConnectionInterface $conn)
        {
            echo "Did Open\n";
            $this->clients->attach($conn);
        }


        function onClose(\Ratchet\ConnectionInterface $conn)
        {
            echo "Did Close\n";
            $this->clients->detach($conn);
        }


        function onError(\Ratchet\ConnectionInterface $conn, \Exception $e)
        {
            echo "The following error occured: ". $e->getMessage();
        }


        function onMessage(\Ratchet\ConnectionInterface $from, $msg)
        {
            $msgObj = json_decode($msg);
            echo $msgObj->msg;
            foreach($this->clients as $client){
                if($client !== $from){
                    $client->send($msg);
                }
            }
        } 
}

问题出现在我使用Java客户端-从Android应用程序。我使用Activity中的线程,没有任何异常和错误。client.isConnected()为true。但是没有服务器代码被调用-onOpen方法,onMessage和其他方法。我该如何解决这个问题?IOS几乎具有相同的情况。客户端连接到服务器,但Ratchet方法中的任何一个都没有被调用。它们只从javascript中调用。Java代码:

new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    client = new Socket("XX.XX.XX.XX", 2000);

                    printWriter = new PrintWriter(client.getOutputStream());
                    printWriter.write("Android Message");
                    printWriter.flush();
                    printWriter.close();
                    client.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }).start();
1个回答

3

谢谢,Java库帮了大忙。我想知道,本地的Java Socket类有什么问题。为什么要使用来自Github的第三方库进行基本套接字编程?也许这个库(由您提供的Java)使用了一些必需的协议,我不知道。我会把解决方案给我的iOS开发人员,并在今天反馈是否iOS Rocket Socket库也能正常工作。无论如何,非常感谢您! - Misha Akopov
1
从记忆中得知,Java内置的Socket类并非为Websockets而设计,而是用于与服务器端口进行直接二进制连接。因此,它不符合WebSocket握手规范,因此不会触发onopen等事件。 - MarshallOfSound
@MarshallOfSound,现在我明白问题了,用Java Sokets花了我一天时间。现在使用Web Socket库就可以工作了。谢谢。 - Misha Akopov
@MishaAkopov,你能告诉我,你用的是哪个Web Socket库吗? - Dolly Aswin
那么对于客户@MishaAkopov呢? - Dolly Aswin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接