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 相关文章推荐
使用Linux五年积累的一些经验技巧
Jun 20 PHP
php中stream(流)的用法
Mar 25 PHP
PHP中unset,array_splice删除数组中元素的区别
Jul 28 PHP
PHP中array_slice函数用法实例详解
Nov 25 PHP
PHP实现获取客户端IP并获取IP信息
Mar 17 PHP
ThinkPHP、ZF2、Yaf、Laravel框架路由大比拼
Mar 25 PHP
PHP使用pear自带的mail类库发邮件的方法
Jul 08 PHP
非常全面的php日期时间运算汇总
Nov 04 PHP
PHP语法小结之基础和变量
Nov 22 PHP
学习php设计模式 php实现门面模式(Facade)
Dec 07 PHP
基于jQueryUI和Corethink实现百度的搜索提示功能
Nov 09 PHP
PHP实现的mysql主从数据库状态检测功能示例
Jul 20 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
cache_lite试用
2007/02/14 PHP
PHP 调试工具Debug Tools
2011/04/30 PHP
PHP SPL标准库中的常用函数介绍
2015/05/11 PHP
基于PHP实现等比压缩图片大小
2016/03/04 PHP
php在windows环境下获得cpu内存实时使用率(推荐)
2018/02/08 PHP
php实现断点续传大文件示例代码
2020/06/19 PHP
如何实现动态删除javascript函数
2007/05/27 Javascript
javascript 装载iframe子页面,自适应高度
2009/03/20 Javascript
javascript 一些用法小结
2009/09/11 Javascript
Jquery ThickBox插件使用心得(不建议使用)
2010/09/08 Javascript
深入理解javaScript中的事件驱动
2013/05/21 Javascript
jQuery 1.9.1源码分析系列(十五)之动画处理
2015/12/03 Javascript
js随机生成26个大小写字母
2016/02/12 Javascript
bootstrap的常用组件和栅格式布局详解
2017/05/02 Javascript
微信小程序swiper组件用法实例分析【附源码下载】
2017/12/07 Javascript
浅谈angular表单提交中ng-submit的默认使用方法
2018/09/30 Javascript
vue router的基本使用和配置教程
2018/11/05 Javascript
微信小程序新手教程之启动页的重要性
2019/03/03 Javascript
js实现无缝轮播图
2020/03/09 Javascript
vue组件库的在线主题编辑器的实现思路
2020/04/03 Javascript
微信小程序实现左滑删除效果
2020/11/18 Javascript
python2.7到3.x迁移指南
2018/02/01 Python
PYTHON基础-时间日期处理小结
2018/05/05 Python
python pandas修改列属性的方法详解
2018/06/09 Python
Django压缩静态文件的实现方法详析
2018/08/26 Python
Python整数与Numpy数据溢出问题解决
2019/09/11 Python
python GUI库图形界面开发之PyQt5状态栏控件QStatusBar详细使用方法实例
2020/02/28 Python
利用css3画个同心圆示例代码
2017/07/03 HTML / CSS
HTML5实现简单图片上传所遇到的问题及解决办法
2016/01/20 HTML / CSS
超市仓管员岗位职责
2014/04/07 职场文书
大学新闻系求职信
2014/06/03 职场文书
大学生自我评价200字(4篇)
2014/09/17 职场文书
2014年团工作总结
2014/11/27 职场文书
2015元旦文艺汇演主持稿(开场白+结束语)
2014/12/14 职场文书
vue封装数字翻牌器
2022/04/20 Vue.js
springboot为异步任务规划自定义线程池的实现
2022/06/14 Java/Android