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写的serv-u的web申请账号的程序
Oct 09 PHP
基于mysql的论坛(3)
Oct 09 PHP
在线增减.htpasswd内的用户
Oct 09 PHP
PHP 数组基础知识小结
Aug 20 PHP
PHP写日志的实现方法
Nov 05 PHP
简单实用的PHP防注入类实例
Dec 05 PHP
基于php的微信公众平台开发入门实例
Apr 15 PHP
PHP身份证校验码计算方法
Aug 10 PHP
PHP实现的XML操作类【XML Library】
Dec 29 PHP
PHP大文件切割上传并带进度条功能示例
Jul 01 PHP
在thinkphp5.0路径中实现去除index.php的方式
Oct 16 PHP
一文看懂PHP进程管理器php-fpm
Jun 01 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
wamp安装后自定义配置的方法
2014/08/23 PHP
YII Framework框架教程之国际化实现方法
2016/03/14 PHP
CI操作cookie的方法分析(基于helper类库)
2016/03/28 PHP
php中二分法查找算法实例分析
2016/09/22 PHP
CI框架入门之MVC简单示例
2016/11/21 PHP
parseInt parseFloat js字符串转换数字
2010/08/01 Javascript
javascript动画对象支持加速、减速、缓入、缓出的实现代码
2012/09/30 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(四)用地图块拼成大地图
2013/01/23 Javascript
input禁止键盘及中文输入,但可以点击
2014/02/13 Javascript
继续学习javascript闭包
2015/12/03 Javascript
使用three.js 画渐变的直线
2016/06/05 Javascript
JSP基于Bootstrap分页显示实例解析
2016/06/12 Javascript
jQuery插件简单学习实例教程
2016/07/01 Javascript
自动化测试读写64位操作系统的注册表
2016/08/15 Javascript
基于JS实现bookstore静态页面的实例代码
2017/02/22 Javascript
深入理解JavaScript 中的匿名函数((function() {})();)与变量的作用域
2018/08/28 Javascript
详解Vue2 添加对scss的支持
2019/01/02 Javascript
Vue2.4+新增属性.sync、$attrs、$listeners的具体使用
2020/03/08 Javascript
vue自定义组件实现双向绑定
2021/01/13 Vue.js
[51:53]DOTA2-DPC中国联赛 正赛 RNG vs Dragon BO3 第二场 1月24日
2021/03/11 DOTA
python中stdout输出不缓存的设置方法
2014/05/29 Python
pymongo中group by的操作方法教程
2019/03/22 Python
tesserocr与pytesseract模块的使用方法解析
2019/08/30 Python
关于Keras模型可视化教程及关键问题的解决
2020/01/24 Python
python如何获得list或numpy数组中最大元素对应的索引
2020/11/16 Python
Tory Burch英国官方网站:美国时尚生活品牌
2017/12/06 全球购物
Boden英国官网:英国知名原创时装品牌
2018/11/06 全球购物
德国珠宝和手表在线商店:VALMANO
2019/03/24 全球购物
《唯一的听众》教学反思
2014/02/20 职场文书
党的群众路线教育实践活动对照检查材料范文
2014/09/24 职场文书
企业三严三实学习心得体会
2014/10/13 职场文书
入党积极分子考察意见
2015/06/02 职场文书
市级三好生竞选稿
2015/11/21 职场文书
2016年感恩母亲节活动总结
2016/04/01 职场文书
用Python简陋模拟n阶魔方
2021/04/17 Python
Python实战实现爬取天气数据并完成可视化分析详解
2022/06/16 Python