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语法速查表
Jan 02 PHP
使用php实现下载生成某链接快捷方式的解决方法
May 07 PHP
php的POSIX 函数以及进程测试的深入分析
Jun 03 PHP
PHP包含文件函数include、include_once、require、require_once区别总结
Apr 05 PHP
ThinkPHP3.1新特性之多层MVC的支持
Jun 19 PHP
php使用fputcsv()函数csv文件读写数据的方法
Jan 06 PHP
百度地图API使用方法详解
Aug 25 PHP
Yii2 输出xml格式数据的方法
May 03 PHP
php如何执行非缓冲查询API
Jul 22 PHP
PHP字典树(Trie树)定义与实现方法示例
Oct 09 PHP
ThinkPHP5.1+Ajax实现的无刷新分页功能示例
Feb 10 PHP
PHP常量DIRECTORY_SEPARATOR原理及用法解析
Nov 10 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
PHP中MD5函数使用实例代码
2008/06/07 PHP
php数组的概述及分类与声明代码演示
2013/02/26 PHP
PHP使用CURL获取302跳转后的地址实例
2014/05/04 PHP
php在数据库抽象层简单使用PDO的方法
2015/11/03 PHP
PHP微信开发之微信录音临时转永久存储
2018/01/26 PHP
阿里对象存储OSS在laravel框架中的使用方法
2019/10/13 PHP
JavaScript中的prototype使用说明
2010/04/13 Javascript
js 静态动态成员 and 信息的封装和隐藏
2011/05/29 Javascript
js中onload与onunload的使用示例
2013/08/25 Javascript
javascript中数组的多种定义方法和常用函数简介
2014/05/09 Javascript
JQuery 控制内容长度超出规定长度显示省略号
2014/05/23 Javascript
解决js下referer兼容各大浏览器的方法
2014/11/03 Javascript
js时间控件只显示年月
2017/01/08 Javascript
分享Bootstrap简单表格、表单、登录页面
2017/08/04 Javascript
Javascript实现购物车功能的详细代码
2018/05/08 Javascript
详解如何在webpack中做预渲染降低首屏空白时间
2018/08/22 Javascript
从零开始封装自己的自定义Vue组件
2018/10/09 Javascript
详解如何在Javascript和Sass之间共享变量
2019/11/13 Javascript
vue 判断元素内容是否超过宽度的方式
2020/07/29 Javascript
[05:08]第一届“网鱼杯”DOTA2比赛精彩集锦
2014/09/05 DOTA
python文件写入实例分析
2015/04/08 Python
python高阶爬虫实战分析
2018/07/29 Python
Pycharm 实现下一个文件引用另外一个文件的方法
2019/01/17 Python
Python如何使用k-means方法将列表中相似的句子归类
2019/08/08 Python
在python3中实现查找数组中最接近与某值的元素操作
2020/02/29 Python
Python新手学习函数默认参数设置
2020/06/03 Python
五分钟带你搞懂python 迭代器与生成器
2020/08/30 Python
美国成衣女装品牌:CHICO’S
2016/09/19 全球购物
国际礼品店:GiftsnIdeas
2018/05/03 全球购物
财务经理岗位职责
2013/11/09 职场文书
优秀体育委员自荐书
2014/01/31 职场文书
法律专业自荐信
2014/06/03 职场文书
地道战观后感
2015/06/04 职场文书
学校证明范文
2015/06/24 职场文书
css height属性中的calc方法详解
2021/06/03 HTML / CSS
《宝可梦》动画制作25周年到来 官方发布特别纪念视频
2022/04/01 日漫