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 和 XML: 使用expat函数(三)
Oct 09 PHP
php dirname(__FILE__) 获取当前文件的绝对路径
Jun 28 PHP
PHP中如何判断AJAX提交的数据
Feb 05 PHP
php class类的用法详细总结
Oct 17 PHP
PHP采用自定义函数实现遍历目录下所有文件的方法
Aug 19 PHP
php 使用array函数实现分页
Feb 13 PHP
PHP使用ffmpeg给视频增加字幕显示的方法
Mar 12 PHP
CodeIgniter配置之config.php用法实例分析
Jan 19 PHP
Yii2针对游客、用户防范规则和限制的解决方法分析
Oct 08 PHP
PHP学习笔记之session
May 06 PHP
基于laravel缓冲cache的用法详解
Oct 23 PHP
TP5框架model常见操作示例小结【增删改查、聚合、时间戳、软删除等】
Apr 05 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中for循环与foreach的区别
2017/03/06 PHP
Jquery+ajax请求data显示在GridView上(asp.net)
2010/08/27 Javascript
用按钮控制iframe显示的网页实现方法
2013/02/04 Javascript
JS中Iframe之间传值及子页面与父页面应用
2013/03/11 Javascript
jQuery去掉字符串起始和结尾的空格(多种方法实现)
2013/04/01 Javascript
JS文本框默认值处理详解
2013/07/10 Javascript
node.js中的querystring.unescape方法使用说明
2014/12/10 Javascript
javascript递归回溯法解八皇后问题
2015/04/22 Javascript
jQuery预加载图片常用方法
2015/06/15 Javascript
Web开发必知Javascript技巧大全
2016/02/23 Javascript
通过node-mysql搭建Windows+Node.js+MySQL环境的教程
2016/03/01 Javascript
jquery实现上传文件大小类型的验证例子(推荐)
2016/06/25 Javascript
微信小程序 WXDropDownMenu组件详解及实例代码
2016/10/24 Javascript
js仿百度音乐全选操作
2017/01/13 Javascript
详解ECMAScript6入门--Class对象
2017/04/27 Javascript
javascript 面向对象实战思想分享
2017/09/07 Javascript
vue解决花括号数据绑定不成功的问题
2019/10/30 Javascript
使用element-ui +Vue 解决 table 里包含表单验证的问题
2020/07/17 Javascript
[52:02]DOTA2-DPC中国联赛 正赛 Phoenix vs Dragon BO3 第二场 2月26日
2021/03/11 DOTA
Python实现识别手写数字 简易图片存储管理系统
2018/01/29 Python
基于python 处理中文路径的终极解决方法
2018/04/12 Python
wxPython实现画图板
2020/08/27 Python
Python爬虫爬取电影票房数据及图表展示操作示例
2020/03/27 Python
经济实惠的名牌太阳镜和眼镜:Privé Revaux
2021/02/07 全球购物
港湾网络笔试题
2014/04/19 面试题
kfc实习自我鉴定
2013/12/14 职场文书
管理专员自荐信
2014/01/26 职场文书
表彰先进的通报
2014/01/31 职场文书
护理专科毕业自荐信范文
2014/04/21 职场文书
2014年妇幼卫生工作总结
2014/12/09 职场文书
项目投资意向书范本
2015/05/09 职场文书
2015年惩防体系建设工作总结
2015/05/22 职场文书
2015年污水处理厂工作总结
2015/05/26 职场文书
新郎父亲婚礼致辞
2015/07/27 职场文书
【HBU】数据库第四周 单表查询
2021/04/05 SQL Server
Sleuth+logback 设置traceid 及自定义信息方式
2021/07/26 Java/Android