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 heredoc和phpwind的模板技术使用方法小结
Mar 28 PHP
php递归列出所有文件和目录的代码
Sep 10 PHP
php Rename 更改文件、文件夹名称
May 24 PHP
在yii中新增一个用户验证的方法详解
Jun 20 PHP
ThinkPHP利用PHPMailer实现邮件发送实现代码
Sep 26 PHP
ThinkPHP视图查询详解
Jun 30 PHP
php实现Linux服务器木马排查及加固功能
Dec 29 PHP
Thinkphp调用Image类生成缩略图的方法
Mar 07 PHP
codeigniter中view通过循环显示数组数据的方法
Mar 20 PHP
PHP检测用户是否关闭浏览器的方法
Feb 14 PHP
详细解读php的命名空间(二)
Feb 21 PHP
Laravel框架自定义公共函数的引入操作示例
Apr 16 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实现框架(二)
2006/10/09 PHP
PHP基于imap获取邮件实例
2014/11/11 PHP
php的GD库imagettftext函数解决中文乱码问题
2015/01/24 PHP
PHP实现支持SSL连接的SMTP邮件发送类
2015/03/05 PHP
php实现图片上传并利用ImageMagick生成缩略图
2016/03/14 PHP
php 广告点击统计代码(php+mysql)
2018/02/21 PHP
tp框架(thinkPHP)实现三次登陆密码错误之后锁定账号功能示例
2018/05/24 PHP
任意位置显示html菜单
2007/02/01 Javascript
asp.net+js 实现无刷新上传解析csv文件的代码
2010/05/17 Javascript
js对象的构造和继承实现代码
2010/12/05 Javascript
jquery连缀语法如何实现
2012/11/29 Javascript
javascript中节点的最近的相关节点访问方法
2013/03/20 Javascript
使用JavaScript 实现对象 匀速/变速运动的方法
2013/05/08 Javascript
深入解析JavaScript的闭包机制
2015/10/20 Javascript
JS实现不使用图片仿Windows右键菜单效果代码
2015/10/22 Javascript
jquery插件锦集【推荐】
2016/12/16 Javascript
详解如何使用Vue2做服务端渲染
2017/03/29 Javascript
使用ionic(选项卡栏tab) icon(图标) ionic上拉菜单(ActionSheet) 实现通讯录界面切换实例代码
2017/10/20 Javascript
JS从非数组对象转数组的方法小结
2018/03/26 Javascript
从零学python系列之浅谈pickle模块封装和拆封数据对象的方法
2014/05/23 Python
Python实现Windows上气泡提醒效果的方法
2015/06/03 Python
python解决Fedora解压zip时中文乱码的方法
2016/09/18 Python
Python数据结构之栈、队列的实现代码分享
2017/12/04 Python
详细分析python3的reduce函数
2017/12/05 Python
python 获得任意路径下的文件及其根目录的方法
2019/02/16 Python
3种python调用其他脚本的方法
2020/01/06 Python
使用Pycharm分段执行代码
2020/04/15 Python
为2021年的第一场雪锦上添花:用matplotlib绘制雪花和雪景
2021/01/05 Python
与UNIX有关的几个名词
2015/09/17 面试题
本科毕业自我鉴定
2014/03/20 职场文书
教师党员公开承诺事项
2014/05/28 职场文书
企业贷款委托书格式
2014/09/12 职场文书
奉献家乡演讲稿
2014/09/13 职场文书
少先队工作总结2015
2015/05/13 职场文书
2015年中秋晚会主持稿
2015/07/30 职场文书
十大最强岩石系宝可梦,怪颚龙实力最强,第七破坏力很强
2022/03/18 日漫