php实现与python进行socket通信的方法示例


Posted in PHP onAugust 30, 2017

本文实例讲述了php实现与python进行socket通信的方法。分享给大家供大家参考,具体如下:

设计目的

通过前端页面发起请求交给php,php创建socket请求交给Python脚本,然后执行完毕之后,返回给前端。

index.html

<html>
<head>
  <title>test</title>
  <script>
  g_xmlHttpReq = new XMLHttpRequest();
  function onReplyCallback()
  {
    if(g_xmlHttpReq.readyState==4 && g_xmlHttpReq.status==200)
    {
      alert(g_xmlHttpReq.responseText);
    }
  }
  function on_stop_service()
  {
    g_xmlHttpReq.open("GET","./service/main.php?cmd=1",true);
    g_xmlHttpReq.onreadystatechange=onReplyCallback;
    g_xmlHttpReq.send(null);
  }
  </script>
</head>
<body>
<button onclick="on_stop_service()">关闭服务</button>
</body>
</html>

service / main.php

<?php
require_once('mysocket.php');
$con = Connector::getInstance();
$req = "aaaaaaa";
$con->sendMsg($req);
$ret = $con->getMsg();
echo $ret;
?>

service / mysocket.php

<?php
class Connector
{
  public static $instance=null;
  public $conn;
  private function __construct()
  {
      set_time_limit(0);
      $ip = '192.168.238.1';
      $port = 8888;
      if(($this->conn = socket_create(AF_INET,SOCK_STREAM,SOL_TCP)) < 0)
      {
        echo "socket_create() 失败的原因是:".socket_strerror($this->conn)."\n";
      }
      $result = socket_connect($this->conn, $ip, $port);
      if ($result < 0) {
        echo "socket_connect() failed.\nReason: ($result) " . socket_strerror($result) . "\n";
      }else {
        echo "连接OK\n";
      }
  }
  public static function getInstance()
  {
    if(is_null(self::$instance))
    {
      self::$instance = new Connector;
    }
    return self::$instance;
  }
  public function sendMsg($msg)
  {
    socket_write($this->conn,$msg);
  }
  public function getMsg()
  {
    $clients = array($this->conn);
    while(true)
    {
      $read = $clients;
      $wrSet = NULL;
      $errSet = NULL;
      if(socket_select($read, $wrSet,$errSet, 3) < 1)
      {
        continue;
      }
      foreach($read as $read_sock)
      {
        $data = @socket_read($read_sock,1024,PHP_BINARY_READ);
        socket_close($this->conn);
        return $data;
      }
    }
  }
}
?>

multiServer.py

import threading
import socket
import time
encoding = 'utf-8'
BUFSIZE = 1024
# a read thread, read data from remote
class Reader(threading.Thread):
  def __init__(self, client):
    threading.Thread.__init__(self)
    self.client = client
  def run(self):
    #while True:
    data = self.client.recv(BUFSIZE)
    if(data):
       string = bytes.decode(data, encoding)
       print "from client::",string,""
       time.sleep(10)
       self.client.send("return frome server::" + string)
    print "close:", self.client.getpeername()
  def readline(self):
    rec = self.inputs.readline()
    if rec:
      string = bytes.decode(rec, encoding)
      if len(string)>2:
        string = string[0:-2]
      else:
        string = ' '
    else:
      string = False
    return string
# a listen thread, listen remote connect
# when a remote machine request to connect, it will create a read thread to handle
class Listener(threading.Thread):
  def __init__(self, port):
    threading.Thread.__init__(self)
    self.port = port
    self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    self.sock.bind(("0.0.0.0", port))
    self.sock.listen(0)
  def run(self):
    print "listener started"
    while True:
      client, cltadd = self.sock.accept()
      print "accept a connect..."
      Reader(client).start()
      cltadd = cltadd
      print "accept a connect(new reader..)"
lst = Listener(8888)  # create a listen thread
lst.start() # then start
# Now, you can use telnet to test it, the command is "telnet 127.0.0.1 9011"
# You also can use web broswer to test, input the address of "http://127.0.0.1:9011" and press Enter button
# Enjoy it....

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
php数组函数序列之in_array() - 查找数组中是否存在指定值
Nov 07 PHP
CodeIgniter输出中文乱码的两种解决办法
Jun 12 PHP
php返回字符串中所有单词的方法
Mar 09 PHP
PHP多文件上传实例
Jul 09 PHP
PHP实现上一篇下一篇的方法实例总结
Sep 22 PHP
php reset() 函数指针指向数组中的第一个元素并输出实例代码
Nov 21 PHP
php+javascript实现的动态显示服务器运行程序进度条功能示例
Aug 07 PHP
利用PHP访问MySql数据库的逻辑操作以及增删改查的实例讲解
Aug 30 PHP
三个思路解决laravel上传文件报错:413 Request Entity Too Large问题
Nov 13 PHP
Yii2压缩PHP中模板代码的输出问题
Aug 28 PHP
PHP中引用类型和值类型功能与用法示例
Feb 26 PHP
Laravel Eloquent分表方法并使用模型关联的实现
Nov 25 PHP
利用PHP访问MySql数据库的逻辑操作以及增删改查的实例讲解
Aug 30 #PHP
PHP Socket网络操作类定义与用法示例
Aug 30 #PHP
[原创]php token使用与验证示例【测试可用】
Aug 30 #PHP
Laravel框架中VerifyCsrfToken报错问题的解决
Aug 30 #PHP
Laravel框架中Blade模板的用法示例
Aug 30 #PHP
php实现支持中文的文件下载功能示例
Aug 30 #PHP
利用PHPStorm如何开发Laravel应用详解
Aug 30 #PHP
You might like
mysql5的sql文件导入到mysql4的方法
2008/10/19 PHP
PHP下通过exec获得计算机的唯一标识[CPU,网卡 MAC地址]
2011/06/09 PHP
PHP查询附近的人及其距离的实现方法
2016/05/11 PHP
PHP addAttribute()函数讲解
2019/02/03 PHP
用一段js程序来实现动画功能
2007/03/06 Javascript
封装好的省市地区联动控件附下载
2007/08/13 Javascript
实例讲解Jquery中隐藏hide、显示show、切换toggle的用法
2016/05/13 Javascript
Bootstrap中data-target 到底是什么
2017/02/14 Javascript
Javascript中类式继承和原型式继承的实现方法和区别之处
2017/04/25 Javascript
Vue SPA单页应用首屏优化实践
2018/06/28 Javascript
javascript删除数组元素的七个方法示例
2019/09/09 Javascript
JS面向对象编程——ES6 中class的继承用法详解
2020/03/03 Javascript
JS实现audio音频剪裁剪切复制播放与上传(步骤详解)
2020/07/28 Javascript
基于原生JS封装的Modal对话框插件的示例代码
2020/09/09 Javascript
[05:24]TI9采访——教练
2019/08/24 DOTA
Python实现在线程里运行scrapy的方法
2015/04/07 Python
python实现数据图表
2017/07/29 Python
Python 模拟登陆的两种实现方法
2017/08/10 Python
Python PO设计模式的具体使用
2019/08/16 Python
详解Flask前后端分离项目案例
2020/07/24 Python
CSS3 3D酷炫立方体变换动画的实现
2019/03/26 HTML / CSS
小女主人连衣裙:Little Mistress
2017/07/10 全球购物
Moda Operandi官网:美国奢侈品电商,海淘秀场T台同款
2020/05/26 全球购物
物业管理大学生个人的自我评价
2013/10/10 职场文书
工商管理专业应届生求职信
2013/11/04 职场文书
农村婚礼证婚词
2014/01/08 职场文书
培训演讲稿范文
2014/01/12 职场文书
网络编辑职责
2014/03/01 职场文书
桥梁工程专业求职信
2014/04/21 职场文书
教师自查自纠材料
2014/10/14 职场文书
2014年服务员个人工作总结
2014/12/23 职场文书
检讨书范文500字
2015/01/28 职场文书
龙潭大峡谷导游词
2015/02/10 职场文书
2015年清明节演讲稿范文
2015/03/17 职场文书
vue Element-ui表格实现树形结构表格
2021/06/07 Vue.js
MySQL定时备份数据库(全库备份)的实现
2021/09/25 MySQL