PHP和FLASH的socket


最近工作闲来无事,于是想到了有不少人为flash的xmlsocket和 php 的socket 多线程通信问题犯愁,经过研究后,测试成功,贴码如下
PHP服务端:

 
<?php
//监听套接字=>数据读取流
    $port = 8653;
$adr = "172.16.100.136";
   
    // create a streaming socket, of type TCP/IP
//创建一个数据流,TCP/IP类型
    $sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
   
    // set the option to reuse the port
//设置可以重用端口的选项
    socket_set_option($sock, SOL_SOCKET, SO_REUSEADDR, 1);
//设置非阻塞
    socket_set_nonblock($sock);
    // "bind" the socket to the address to "localhost", on port $port
    // so this means that all connections on this port are now our resposibility to send/recv data, disconnect, etc..
//绑定套接字到指定的地址和端口
//而这意味着所有的消息发送/接受,,断开都要通过这个端口的链接
    socket_bind($sock, 0, $port);
   
    // start listen for connections
//开始侦听链接
    socket_listen($sock);
    // create a list of all the clients that will be connected to us..
    // add the listening socket to this list
//创建一份将连接我们的链接池
//并且将监听套接字也添加到该池子
    $clients = array($sock);
    while (true) {
  // create a copy, so $clients doesn't get modified by socket_select()
  //创建一份复制,防止链接池不会被socket_select( )改变,因为是引用传入
 
  $newsock = @socket_accept($sock);
  if (false === in_array($newsock, $clients) && false !== $newsock) {
   $clients[] = $newsock;
   $data = @socket_read($newsock, 1024, PHP_BINARY_READ);
   $data = trim($data);
   echo $data . "\n";
   if ('<policy-file-request/>' === $data) {
    $msg ="<cross-domain-policy><allow-access-from domain='*' to-ports='*' /></cross-domain-policy>\0";
    socket_write($newsock, $msg, strlen($msg));
    echo "PHP-Auth\n";
   } else {
    socket_getpeername($newsock, $ip);
    echo "New client connected: {$ip}:\n";
    $msg = $data . "\0";
    socket_write($newsock, $msg, strlen($msg));
   }
   continue; 
  } else {
   $read = $clients;
   // get a list of all the clients that have data to be read from
   // if there are no clients with data, go to next iteration
   //获取一份所有能读取到数据的链接池
   //如果传递过来的链接池没有有数据的,进入下一个循环
   $res = @socket_select($read, $write = NULL, $except = NULL, 0);
   if (false === $res) {
    echo "Client disconnected\n";
    break;
   } else if (0 < $res) {
    foreach ($read as $read_sock) {
     if ($sock !== $read_sock) {
      $data = @socket_read($read_sock, 1024, PHP_BINARY_READ);
      if (false === $data) {
       // remove client for $clients array
       $key = array_search($read_sock, $clients, true);
       unset($clients[$key]);
       //var_dump($read_sock);
       echo "client disconnected.\n";
      } else {
       $data = trim($data);
       if ('' !== $data) {
        //var_dump($clients);
        //var_dump($read);
        //echo "resource:$res\n";
        echo $data . "...\n";
        $msg = $data . "\0";
        socket_write($read_sock, $msg, strlen($msg));
       }
      }
     }
    }
   }
  }
    }
    // close the listening socket
//关闭监听套接字
    @socket_close($sock);
?>

HTML代码:

 
< HTML>
<HEAD>
<meta http-equiv=Content-Type content="text/html;  charset=GB2312">
<TITLE>3</TITLE>
<script>
function back(msg) {
  var obj = document.getElementById('res');
  obj.innerHTML = obj.innerHTML + msg + "<br>\n";
}
function send() {
  var msg = document.getElementById('msg').value;
  window.document.myFlash.SetVariable("msg", msg);
}
</script>
</HEAD>
<BODY bgcolor="#FFFFFF">
<div id="res"></div>
<!-- URL's used in the movie-->
<!-- text used in the movie-->
< OBJECT classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0"
WIDTH="50" HEIGHT="40" id="myFlash" ALIGN="middle">
<PARAM NAME=movie VALUE="3.swf">
<PARAM NAME=quality VALUE=high>
<PARAM NAME=bgcolor VALUE=#FFFFFF>
<EMBED src="3.swf" quality=high bgcolor=#FFFFFF  WIDTH="550" HEIGHT="400" NAME="myFlash" ALIGN=""
TYPE="application/x-shockwave-flash" PLUGINSPAGE="http://www.macromedia.com/go/getflashplayer" allowScriptAccess="sameDomain"   swLiveConnect="true"></EMBED>
</OBJECT>
<input type=text id="msg"><button οnclick="send()">Send</button>
</BODY>
</HTML>

FLASH代码:

 
var mySocket = new XMLSocket();
mySocket.connect("172.16.100.136", 8653);
mySocket.onConnect = function(res) {
if (false === res) {
  getURL("javascript:back('Failed.')");
} else {
  getURL("javascript:back('success.')");
}
};
mySocket.onData = function(msg) {
getURL("javascript:back('Recv:" + msg + "')");
return false;
};
mySocket.onClose = function() {
getURL("javascript:back('Close!')");
};
function sendmsg(msg){
mySocket.send(msg);
getURL("javascript:back('send:" +  msg + "')");
return false;
};
addProperty("msg",function(){},sendmsg);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mumu_wangwei

主修"红尘道--红尘练心"

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值