>백엔드 개발 >PHP 튜토리얼 >IE下运行WebSocket出现问题,而火狐却运行正常。

IE下运行WebSocket出现问题,而火狐却运行正常。

WBOY
WBOY원래의
2016-06-06 20:12:541189검색

我用 php 写了个 socket 服务端,然后在火狐运行客户端握手成功后,
1.用 send()函数发送信息给服务端
2.服务端 socket__read 提取信息
3.再用 socket__write 返回信息可以触发客户端的 onmessage 事件。

而在 ie 和 chrome 下却触发不了 onmessage 事件,
1.首先 send()发送信息到服务端
2.socket__select 获得套接字 A , socket__read 取得信息
3.再将同样的信息用 socket__write 返回给套接字 A ,之后再监听套接字 A ,在火狐下这样就会结束
但是在 ie 下 socket__select 会再次获得套接字 A ,接着重复取得以及返回信息最后监听套接字 A 。 当然还没完, socket__select 还会获得套接字 A ,在经历前两次的 read 和 write 后,这次 socket__read 取得的信息会是空值。

顺便一提,在 ie 下服务端第一次执行 socket__write 的返回值是 int(10),这是正常的,而第二次执行 write 会返回 int(32),因为是在 cmd 下运行 php 文件的, socket__read 取得的信息显示为乱码(握手协议倒是显示正常),所以我不知道第二次 socket__write 返回的信息是什么。
为什么会这样?明明握手都可以成功来着, onopen 事件已经触发了,为什么到 onmessage 的时候就出现问题!

如果单凭以上的信息无法找到问题的话,下面是我的代码:
html:

<code>


<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
<meta name="description" content="test">
<meta name="keywords" content="test">
<meta name="renderer" content="ie-stand">
<title>test</title>


<p id="p" style="text-align:center"></p>
<button onclick="send()">Send</button>

<script>
socket=new WebSocket("ws://localhost:1199");
socket.onopen=function(){document.querySelector("#p").innerHTML="ws";}
socket.onmessage=function(e){document.querySelector("#p").innerHTML=e.data;}
function send(){socket.send("test");}
</script>

</code>

php:

<code>
$master=socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
socket_set_option($master,SOL_SOCKET,SO_REUSEADDR,1);
socket_bind($master,"localhost",1199);
socket_listen($master,5);
$sockets[]=$master;$w=NULL;$r=NULL;
for($i=0;;$i++){
    $sockets_copy=$sockets;echo"select_bf: ";var_dump($sockets_copy);echo"\n";
    socket_select($sockets_copy,$r,$w,NULL);
    foreach($sockets_copy as $socket){
        if($socket==$master){echo"true\n";$client=socket_accept($socket);array_push($sockets,$client);}
        else{echo"false: ";var_dump($socket);echo"\n";
            $buffer=socket_read($socket,1024);echo"buffer:".$buffer."\n";
            if($buffer==""){echo"true_1\n";sort($sockets);$num=array_keys($sockets,$socket);array_splice($sockets,$num[0],1);socket_close($socket);}
            else{echo"false_1\n";
                if(preg_match("/(?</code>

回复内容:

我用 php 写了个 socket 服务端,然后在火狐运行客户端握手成功后,
1.用 send()函数发送信息给服务端
2.服务端 socket__read 提取信息
3.再用 socket__write 返回信息可以触发客户端的 onmessage 事件。

而在 ie 和 chrome 下却触发不了 onmessage 事件,
1.首先 send()发送信息到服务端
2.socket__select 获得套接字 A , socket__read 取得信息
3.再将同样的信息用 socket__write 返回给套接字 A ,之后再监听套接字 A ,在火狐下这样就会结束
但是在 ie 下 socket__select 会再次获得套接字 A ,接着重复取得以及返回信息最后监听套接字 A 。 当然还没完, socket__select 还会获得套接字 A ,在经历前两次的 read 和 write 后,这次 socket__read 取得的信息会是空值。

顺便一提,在 ie 下服务端第一次执行 socket__write 的返回值是 int(10),这是正常的,而第二次执行 write 会返回 int(32),因为是在 cmd 下运行 php 文件的, socket__read 取得的信息显示为乱码(握手协议倒是显示正常),所以我不知道第二次 socket__write 返回的信息是什么。
为什么会这样?明明握手都可以成功来着, onopen 事件已经触发了,为什么到 onmessage 的时候就出现问题!

如果单凭以上的信息无法找到问题的话,下面是我的代码:
html:

<code>


<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
<meta name="description" content="test">
<meta name="keywords" content="test">
<meta name="renderer" content="ie-stand">
<title>test</title>


<p id="p" style="text-align:center"></p>
<button onclick="send()">Send</button>

<script>
socket=new WebSocket("ws://localhost:1199");
socket.onopen=function(){document.querySelector("#p").innerHTML="ws";}
socket.onmessage=function(e){document.querySelector("#p").innerHTML=e.data;}
function send(){socket.send("test");}
</script>

</code>

php:

<code>
$master=socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
socket_set_option($master,SOL_SOCKET,SO_REUSEADDR,1);
socket_bind($master,"localhost",1199);
socket_listen($master,5);
$sockets[]=$master;$w=NULL;$r=NULL;
for($i=0;;$i++){
    $sockets_copy=$sockets;echo"select_bf: ";var_dump($sockets_copy);echo"\n";
    socket_select($sockets_copy,$r,$w,NULL);
    foreach($sockets_copy as $socket){
        if($socket==$master){echo"true\n";$client=socket_accept($socket);array_push($sockets,$client);}
        else{echo"false: ";var_dump($socket);echo"\n";
            $buffer=socket_read($socket,1024);echo"buffer:".$buffer."\n";
            if($buffer==""){echo"true_1\n";sort($sockets);$num=array_keys($sockets,$socket);array_splice($sockets,$num[0],1);socket_close($socket);}
            else{echo"false_1\n";
                if(preg_match("/(?</code>

参考:https://segmentfault.com/q/1010000004859...

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.