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 相关文章推荐
文章推荐系统(二)
Oct 09 PHP
打造计数器DIY三步曲(下)
Oct 09 PHP
PHP编程中八种常见的文件操作方式
Nov 19 PHP
php自定义函数call_user_func和call_user_func_array详解
Jul 14 PHP
初步介绍PHP扩展开发经验分享
Sep 06 PHP
PHP删除目录及目录下所有文件的方法详解
Jun 06 PHP
PHP中date与gmdate的区别及默认时区设置
May 12 PHP
PHP中创建图像并绘制文字的例子
Nov 19 PHP
php文件压缩之PHPZip类用法实例
Jun 18 PHP
yii权限控制的方法(三种方法)
Dec 28 PHP
Yii框架防止sql注入,xss攻击与csrf攻击的方法
Oct 18 PHP
PHP中的函数声明与使用详解
May 27 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 对输入信息的进行安全过滤的函数代码
2012/06/29 PHP
浅谈php函数serialize()与unserialize()的使用方法
2014/08/19 PHP
phpinfo()中Loaded Configuration File(none)的解决方法
2017/01/16 PHP
Symfony2针对输入时间进行查询的方法分析
2017/06/28 PHP
获取Javscript执行函数名称的方法
2006/12/22 Javascript
jQuery帮助之筛选查找 children([expr])
2011/01/31 Javascript
JS解析json数据并将json字符串转化为数组的实现方法
2012/12/25 Javascript
解析Jquery的LigerUI如何实现文件上传
2013/07/09 Javascript
js下拉框二级关联菜单效果代码具体实现
2013/08/03 Javascript
Jquery中children与find之间的区别详细解析
2013/11/29 Javascript
分享一个自己写的简单的javascript分页组件
2015/02/15 Javascript
jquery图形密码实现方法
2015/03/11 Javascript
JQuery实现超链接鼠标提示效果的方法
2015/06/10 Javascript
jQuery检测返回值的数据类型
2015/07/13 Javascript
Js与Jq获取浏览器和对象值的方法
2016/03/18 Javascript
轻松掌握JavaScript中介者模式
2016/08/26 Javascript
Angularjs实现上传图片预览功能
2017/09/01 Javascript
JavaScript中reduce()的5个基本用法示例
2020/07/19 Javascript
JS获取当前时间戳方法解析
2020/08/29 Javascript
python设计模式大全
2016/06/27 Python
python dict.get()和dict['key']的区别详解
2016/06/30 Python
python中的随机函数小结
2018/01/27 Python
浅谈Series和DataFrame中的sort_index方法
2018/06/07 Python
python 字符串只保留汉字的方法
2018/11/16 Python
Django框架登录加上验证码校验实现验证功能示例
2019/05/23 Python
pandas DataFrame的修改方法(值、列、索引)
2019/08/02 Python
Pytorch 计算误判率,计算准确率,计算召回率的例子
2020/01/18 Python
基于python-pptx库中文文档及使用详解
2020/02/14 Python
Python迭代器Iterable判断方法解析
2020/03/16 Python
保护环境倡议书范文
2014/05/13 职场文书
责任胜于能力演讲稿
2014/05/20 职场文书
国际贸易专业求职信
2014/06/04 职场文书
个人安全生产责任书
2014/07/28 职场文书
逃出克隆岛观后感
2015/06/09 职场文书
MySQL 5.7常见数据类型
2021/07/15 MySQL
java中如何截取字符串最后一位
2022/07/07 Java/Android