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 相关文章推荐
实现树状结构的两种方法
Oct 09 PHP
二十行语句实现从Excel到mysql的转化
Oct 09 PHP
PHP时间格式控制符对照表分享
Jul 23 PHP
使用ob系列函数实现PHP网站页面静态化
Aug 13 PHP
给ECShop添加最新评论
Jan 07 PHP
php实现读取内存顺序号
Mar 29 PHP
PHP实现删除字符串中任何字符的函数
Aug 11 PHP
php验证码实现代码(3种)
Sep 07 PHP
php metaphone()函数的定义和用法
May 15 PHP
php之可变函数的实例详解
Sep 13 PHP
通过PHP实现用户注册后邮箱验证激活
Nov 10 PHP
PHP实现考试倒计时功能代码
Apr 16 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
从康盛产品(discuz)提取出来的模板类
2011/06/28 PHP
CodeIgniter CLI模式简介
2014/06/17 PHP
thinkPHP引入类的方法详解
2016/12/08 PHP
Laravel如何实现自动加载类
2019/10/14 PHP
广告显示判断
2006/08/31 Javascript
jquery 事件冒泡的介绍以及如何阻止事件冒泡
2012/12/25 Javascript
使用js在页面中绘制表格核心代码
2013/09/16 Javascript
js计算两个时间之间天数差的实例代码
2013/11/19 Javascript
JS实现页面超时后自动跳转到登陆页面
2015/01/19 Javascript
jQuery检测鼠标左键和右键点击的方法
2015/03/17 Javascript
深入分析Javascript跨域问题
2015/04/17 Javascript
全面了解javascript三元运算符
2016/06/27 Javascript
IE下JS保存图片的简单实例
2016/07/15 Javascript
Bootstrap table两种分页示例
2016/12/23 Javascript
JS控件bootstrap datepicker使用方法详解
2017/03/25 Javascript
Angular 4.x中表单Reactive Forms详解
2017/04/25 Javascript
jQuery EasyUI开发技巧总结
2017/09/26 jQuery
JS实现简单获取最近7天和最近3天日期的方法
2018/04/18 Javascript
angular组件间通讯的实现方法示例
2020/05/07 Javascript
JS实现简易贪吃蛇游戏
2020/08/24 Javascript
vue实现前端列表多条件筛选
2020/10/26 Javascript
[00:20]TI9不朽观赛名额抽取
2019/08/05 DOTA
Python实现动态添加类的属性或成员函数的解决方法
2014/07/16 Python
跟老齐学Python之开始真正编程
2014/09/12 Python
Python数据持久化存储实现方法分析
2019/12/21 Python
python 6种方法实现单例模式
2020/12/15 Python
CSS3实现千变万化的文字阴影text-shadow效果设计
2016/04/26 HTML / CSS
HTML5 和小程序实现拍照图片旋转、压缩和上传功能
2018/10/08 HTML / CSS
将"引用"作为函数返回值类型的格式、好处和需要遵守的规则
2016/02/09 面试题
高中生的学习总结自我鉴定
2013/10/26 职场文书
试用期员工考核制度
2014/01/22 职场文书
老师的检讨书
2014/02/23 职场文书
院领导写的就业推荐信
2014/03/09 职场文书
四风问题原因分析及整改措施
2014/10/24 职场文书
2014年人事工作总结范文
2014/11/19 职场文书
使用Python拟合函数曲线
2022/04/14 Python