Heim >Backend-Entwicklung >PHP-Tutorial >IE下运行WebSocket出现问题,而火狐却运行正常。

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

WBOY
WBOYOriginal
2016-06-06 20:12:541189Durchsuche

我用 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...

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn