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令牌 Token改进版
Jul 18 PHP
PHP通过iconv将字符串从GBK转换为UTF8字符集
Jul 18 PHP
php实现rc4加密算法代码
Apr 25 PHP
php加水印的代码(支持半透明透明打水印,支持png透明背景)
Jan 17 PHP
php中过滤非法字符的具体实现
Oct 29 PHP
2个Codeigniter文件批量上传控制器写法例子
Jul 25 PHP
php常见的魔术方法详解
Dec 25 PHP
php curl请求信息和返回信息设置代码实例
Apr 27 PHP
PHP云打印类完整示例
Oct 15 PHP
PHP在linux上执行外部命令的方法
Feb 06 PHP
PHP获取当前URL路径的处理方法(适用于多条件筛选列表)
Feb 10 PHP
php微信公众号开发之关键词回复
Oct 20 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 cookie 作用范围?不要在当前页面使用你的cookie
2009/03/24 PHP
php 数组二分法查找函数代码
2010/02/16 PHP
深入了解 register_globals (附register_globals=off 网站打不开的解决方法)
2012/06/27 PHP
php配置php-fpm启动参数及配置详解
2013/11/04 PHP
php中使用websocket详解
2016/09/23 PHP
PHP isset()及empty()用法区别详解
2020/08/29 PHP
javascript判断单选框或复选框是否选中方法集锦
2007/04/04 Javascript
select标签模拟/美化方法采用JS外挂式插件
2013/04/01 Javascript
JQuery DataTable删除行后的页面更新利用Ajax解决
2013/05/17 Javascript
JS中把字符转成ASCII值的函数示例代码
2013/11/21 Javascript
jQuery实现异步获取json数据的2种方式
2014/08/29 Javascript
jquery插件unobtrusive实现片段式加载
2015/06/15 Javascript
jQuery实现图片轮播特效代码分享
2015/09/15 Javascript
jQuery中inArray方法注意事项分析
2016/01/25 Javascript
jQuery代码实现表格中点击相应行变色功能
2016/05/09 Javascript
JavaScript使用键盘输入控制实现数字验证功能
2016/08/19 Javascript
通过bootstrap全面学习less
2016/11/09 Javascript
layui的table单击行勾选checkbox功能方法
2018/08/14 Javascript
[01:12]快闪回顾DOTA2亚洲邀请赛(DAC) 静候2018新征程开启
2018/03/11 DOTA
[51:10]VP vs VGJ.S 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
Python的Django框架中模板碎片缓存简介
2015/07/24 Python
Python检测网站链接是否已存在
2016/04/07 Python
Python进行数据提取的方法总结
2016/08/22 Python
Python中struct模块对字节流/二进制流的操作教程
2017/01/21 Python
Python键盘输入转换为列表的实例
2018/06/23 Python
Python2和Python3中@abstractmethod使用方法
2020/02/04 Python
python3.x中安装web.py步骤方法
2020/06/23 Python
pytorch查看模型weight与grad方式
2020/06/24 Python
PyCharm最新激活码(2020/10/27全网最新)
2020/10/27 Python
海淘母婴商城:国际妈咪
2016/07/23 全球购物
美国二手奢侈品寄售网站:TheRealReal
2016/10/29 全球购物
银行职员工作失误检讨书
2014/10/14 职场文书
社会实践单位意见
2015/06/05 职场文书
浅谈MySQL user权限表
2021/06/18 MySQL
vue中data里面的数据相互使用方式
2022/06/05 Vue.js