进公司遇到的第一个难题 ,以前从来没有接触过这个协议 经过查阅大量资料 终于解决 直接上服务器端代码
<?php class Listen extends CI_Controller { /* public function __construct() { parent::__construct(); }*/ public function index() { //确保在连接客户端时不会超时 ignore_user_abort(true);// 后台运行 set_time_limit(0); // 取消脚本运行时间的超时上限 header("Connection: close");//告诉浏览器,连接关闭了,这样浏览器就不用等待服务器的响应 header("HTTP/1.1 200 OK");//可以发送200状态码,以这些请求是成功的,要不然可能浏览器会重试,特别是有代理的情况下 $ip = 'ip'; $port = 端口号; //导入ci数据库类 $this->load->database(); //设置缓存类型 $this->load->driver('cache', array('adapter' => 'memcached', 'backup' => 'file')); /*---------------- 以下操作都是手册上的 -------------------*/ if(($sock = socket_create(AF_INET,SOCK_STREAM,0)) < 0) { echo "socket_create() 失败的原因是:".socket_strerror($sock)."\n"; } if(($ret = socket_bind($sock,$ip,$port)) < 0) { echo "socket_bind() 失败的原因是:".socket_strerror($ret)."\n"; } if(($ret = socket_listen($sock,3)) < 0) { echo "socket_listen() 失败的原因是:".socket_strerror($ret)."\n"; } do { if (($msgsock = socket_accept($sock)) < 0) {//循环绑定获得资源 // echo "socket_accept() failed: reason: " . socket_strerror($msgsock) . "\n"; // break; }else{ $buf = socket_read($msgsock,1024);//读取获得的资源 if($buf){//判断有没有资源 有的话 转化资源存储 $dates = date("Ymdhis",time()); $lenth = strlen($buf); $new = ""; for ($i=0;$i<$lenth;$i++){ $new .= bin2hex($buf[$i])." "; } //$this->lk_common->updateTableValue('listen',array('content'=>$new,'createtime'=>$dates)); $data=array('content'=>$new,'createtime'=>$dates); $this->db->insert('listen',$data); socket_close($msgsock); }else{//资源为空的话 执行这个操作 关闭所有socket资源 socket_close($msgsock); socket_close($sock); } } }while (true); socket_close($msgsock);//这里再进行关闭 我是防止 资源没有彻底关闭 产生close_wait状态 socket_close($sock); } }直接按网上搜到的写 中间一直是 只能接收一次数据 后面的全部因为close_wait状态 无法再次接收 按这个代码写就可以了 求大神指教 刚接触 写的不严谨多多包含