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 相关文章推荐
BBS(php &amp; mysql)完整版(三)
Oct 09 PHP
php用数组返回无限分类的列表数据的代码
Aug 08 PHP
php程序的国际化实现方法(利用gettext)
Aug 14 PHP
详解php魔术方法(Magic methods)的使用方法
Feb 14 PHP
PHP怎样用正则抓取页面中的网址
Aug 09 PHP
详谈PHP中的密码安全性Password Hashing
Feb 04 PHP
yii2 resetful 授权验证详解
May 18 PHP
详解如何在云服务器上部署Laravel
Jun 30 PHP
laravel如何开启跨域功能示例详解
Aug 31 PHP
详解thinkphp中的volist标签
Jan 15 PHP
PHP中如何使用Redis接管文件存储Session详解
Nov 28 PHP
PHP5中使用mysqli的prepare操作数据库的介绍
Mar 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 增加了对 .ZIP 文件的读取功能
2006/10/09 PHP
php笔记之:有规律大文件的读取与写入的分析
2013/04/26 PHP
解析php中用PHPMailer来发送邮件的示例(126.com的例子)
2013/06/24 PHP
使用Composer安装Yii框架的方法
2016/03/15 PHP
提交表单后 PHP获取提交内容的实现方法
2016/05/25 PHP
PHP获取当前文件的父目录方法汇总
2016/07/21 PHP
浅谈PHP中类和对象的相关函数
2017/04/26 PHP
Laravel框架模板继承操作示例
2018/06/11 PHP
常用参考资料(手册)下载或者链接
2006/07/22 Javascript
Js从头学起(基本数据类型和引用类型的参数传递详细分析)
2012/02/16 Javascript
jQuery调用AJAX时Get和post公用的乱码解决方法实例说明
2013/06/04 Javascript
JS中获取函数调用链所有参数的方法
2015/05/07 Javascript
javascript实现网页中涉及的简易运动(改变宽高、透明度、位置)
2015/11/29 Javascript
深入理解Ajax的get和post请求
2016/06/02 Javascript
深入理解Webpack 中路径的配置
2017/06/17 Javascript
基于axios封装fetch方法及调用实例
2018/02/05 Javascript
Vue实现自定义下拉菜单功能
2018/07/16 Javascript
Vue项目报错:Uncaught SyntaxError: Unexpected token
2018/11/10 Javascript
JavaScript动态检测密码强度原理及实现方法详解
2019/06/11 Javascript
layui给下拉框、按钮状态、时间赋初始值的方法
2019/09/10 Javascript
Vue.js实现大屏数字滚动翻转效果
2019/11/29 Javascript
详解Django通用视图中的函数包装
2015/07/21 Python
python之文件读取一行一行的方法
2018/07/12 Python
详解PANDAS 数据合并与重塑(join/merge篇)
2019/07/09 Python
python批量图片处理简单示例
2019/08/06 Python
使用sklearn的cross_val_score进行交叉验证实例
2020/02/28 Python
Python新建项目自动添加介绍和utf-8编码的方法
2020/12/26 Python
Envie de Fraise意大利:法国网上推出的孕妇装品牌
2020/10/18 全球购物
广州一家公司的.NET面试题
2016/06/11 面试题
2013英文求职信模板范文
2013/11/15 职场文书
校长就职演讲稿
2014/01/06 职场文书
财务会计专业自荐书
2014/06/30 职场文书
户外拓展训练感想
2015/08/07 职场文书
2016中考冲刺决心书
2015/09/22 职场文书
2019通用版新员工入职培训方案!
2019/07/11 职场文书
python实现简单的三子棋游戏
2022/04/28 Python