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新手上路(三)
Oct 09 PHP
DISCUZ 分页代码
Jan 02 PHP
一个捕获函数输出的函数
Feb 14 PHP
PHP屏蔽过滤指定关键字的方法
Nov 03 PHP
Laravel路由设定和子路由设定实例分析
Mar 30 PHP
PHP实现QQ快速登录的方法
Sep 28 PHP
PHP Header失效的原因分析及解决方法
Nov 16 PHP
php过滤输入操作之htmlentities与htmlspecialchars用法分析
Feb 17 PHP
php实现生成code128条形码的方法详解
Jul 19 PHP
php设计模式之职责链模式实例分析【星际争霸游戏案例】
Mar 27 PHP
Laravel6.18.19如何优雅的切换发件账户
Jun 14 PHP
php png失真的原因及解决办法
Oct 24 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中使用Curl、socket、file_get_contents三种方法POST提交数据
2011/08/12 PHP
使用 PHPMAILER 发送邮件实例应用
2012/11/07 PHP
PHP以及MYSQL日期比较方法
2012/11/29 PHP
Yii操作数据库的3种方法
2014/03/11 PHP
php实现获取文件mime类型的方法
2015/02/11 PHP
typecho插件编写教程(二):写一个新插件
2015/05/28 PHP
php批量修改表结构实例
2017/05/24 PHP
Laravel框架使用Seeder实现自动填充数据功能
2018/06/13 PHP
js 获取中文拼音,Select自动匹配字母获取值的代码
2009/09/23 Javascript
javascript Onunload与Onbeforeunload使用小结
2009/12/31 Javascript
ExtJS PropertyGrid中使用Combobox选择值问题
2010/06/13 Javascript
使用js检测浏览器的实现代码
2013/05/14 Javascript
js对象继承之原型链继承实例
2015/01/10 Javascript
JavaScript数组常用方法
2015/03/02 Javascript
JavaScript使用encodeURI()和decodeURI()获取字符串值的方法
2015/08/04 Javascript
jQuery轻松实现表格的隔行变色和点击行变色的实例代码
2016/05/09 Javascript
在create-react-app中使用css modules的示例代码
2018/07/31 Javascript
Vue.js使用axios动态获取response里的data数据操作
2020/09/08 Javascript
解决vscode进行vue格式化,会自动补分号和双引号的问题
2020/10/26 Javascript
python基于BeautifulSoup实现抓取网页指定内容的方法
2015/07/09 Python
python清理子进程机制剖析
2017/11/23 Python
python如何创建TCP服务端和客户端
2018/08/26 Python
Python实现EXCEL表格的排序功能示例
2019/06/25 Python
python pandas获取csv指定行 列的操作方法
2019/07/12 Python
Python类中方法getitem和getattr详解
2019/08/30 Python
TensorFlow实现批量归一化操作的示例
2020/04/22 Python
美国百货齐全的精品网站,提供美式风格的产品:Overstock.com
2016/07/22 全球购物
Schecker荷兰:狗狗用品和配件
2019/06/06 全球购物
The Body Shop美体小铺西班牙官网:天然化妆品
2019/06/21 全球购物
英国家具、照明、家居用品网上商店:Wayfair.co.uk
2020/02/13 全球购物
秘书行业自我鉴定范文
2013/12/30 职场文书
建议书怎么写
2014/03/12 职场文书
2014党员民主评议个人思想剖析发言
2014/09/19 职场文书
2014年教务工作总结
2014/12/03 职场文书
2015年个人现实表现材料
2014/12/10 职场文书
2015圣诞节贺卡寄语
2015/03/24 职场文书