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开发中的错误收集,不定期更新。
Feb 03 PHP
解析PHP跨站刷票的实现代码
Jun 18 PHP
新手菜鸟必读:session与cookie的区别
Aug 22 PHP
php下foreach提示Warning:Invalid argument supplied for foreach()的解决方法
Nov 11 PHP
php中有关合并某一字段键值相同的数组合并的改进
Mar 10 PHP
PHP使用DirectoryIterator显示下拉文件列表的方法
Mar 13 PHP
浅谈PHP中Stream(流)
Jun 08 PHP
PHP提高编程效率的20个要点
Sep 23 PHP
php版微信公众账号第三方管理工具开发简明教程
Sep 23 PHP
Yii2框架数据验证操作实例详解
May 02 PHP
PHP7 mongoDB扩展使用的方法分享
May 02 PHP
tp5递归 无限级分类详解
Oct 18 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与XML联手进行网站编程代码实例
2008/07/10 PHP
php下关于中英数字混排的字符串分割问题
2010/04/06 PHP
ThinkPHP实现多数据库连接的解决方法
2014/07/01 PHP
PHP基于Redis消息队列实现发布微博的方法
2017/05/03 PHP
laravel 查询数据库获取结果实现判断是否为空
2019/10/24 PHP
laravel数据库查询结果自动转数组修改实例
2021/02/27 PHP
在IE,Firefox,Safari,Chrome,Opera浏览器上调试javascript
2008/12/02 Javascript
jquery 插件开发方法小结
2009/10/23 Javascript
sogou地图API用法实例教程
2014/09/11 Javascript
一个检测表单数据的JavaScript实例
2014/10/31 Javascript
JQuery的ON()方法支持的所有事件罗列
2015/02/28 Javascript
javascript判断图片是否加载完成的方法推荐
2016/05/13 Javascript
jQuery on()方法绑定动态元素的点击事件实例代码浅析
2016/06/16 Javascript
js图片上传前预览功能(兼容所有浏览器)
2016/08/24 Javascript
JQuery控制DIV的选取实现方法
2016/09/18 Javascript
JavaScript动态数量的文件上传控件
2016/11/18 Javascript
微信小程序 UI与容器组件总结
2017/02/21 Javascript
vue项目实现记住密码到cookie功能示例(附源码)
2018/01/31 Javascript
vue中的provide/inject的学习使用
2018/05/09 Javascript
简单说说angular.json文件的使用
2018/10/29 Javascript
js canvas实现画图、滤镜效果
2018/11/27 Javascript
JS学习笔记之闭包小案例分析
2019/05/29 Javascript
微信小程序mpvue点击按钮获取button值的方法
2019/05/29 Javascript
JavaScript实现英语单词题库
2019/12/24 Javascript
解决微信小程序scroll-view组件无横向滚动的问题
2020/02/04 Javascript
python使用psutil模块获取系统状态
2016/08/27 Python
python实现图片筛选程序
2018/10/24 Python
pycharm中使用anaconda部署python环境的方法步骤
2018/12/19 Python
Python2与Python3的区别实例总结
2019/04/17 Python
HTML5 Canvas API中drawImage()方法的使用实例
2016/03/25 HTML / CSS
Html5 APP中监听返回事件处理的方法示例
2018/03/15 HTML / CSS
博士研究生自我鉴定范文
2013/12/04 职场文书
2014国培学习感言
2014/03/05 职场文书
企业授权委托书范本
2014/04/02 职场文书
教你怎么用Python监控愉客行车程
2021/04/29 Python
Mysql忘记密码解决方法
2022/02/12 MySQL