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文件向另一个地址post数据,不用表单和隐藏的变量的
Mar 06 PHP
php读取30天之内的根据算法排序的代码
Apr 06 PHP
discuz论坛 用户登录 后台程序代码
Nov 27 PHP
php 获取当前访问的url文件名的方法小结
Feb 08 PHP
php中大括号作用介绍
Mar 22 PHP
ThinkPHP 连接Oracle数据库的详细教程[全]
Jul 16 PHP
PHP常用开发函数解析之数组篇[未完结]
Jul 30 PHP
PHP中include与require使用方法区别详解
Oct 19 PHP
PHP二维数组排序的3种方法和自定义函数分享
Apr 09 PHP
新浪SAE云平台下使用codeigniter的数据库配置
Jun 12 PHP
PHP中异常处理的一些方法整理
Jul 03 PHP
TP5框架实现上传多张图片的方法分析
Mar 29 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
世界第一个无线广播电台 KDKA
2021/03/01 无线电
把PHP安装为Apache DSO
2006/10/09 PHP
php面向对象全攻略 (十七) 自动加载类
2009/09/30 PHP
封装ThinkPHP的一个文件上传方法实例
2014/10/31 PHP
PHP处理二进制数据的实现方法
2016/06/13 PHP
PHP文件上传操作实例详解
2016/09/27 PHP
PHP基于socket实现的简单客户端和服务端通讯功能示例
2017/07/10 PHP
PHP去除空数组且数组键名重置的讲解
2019/02/28 PHP
IE下Ajax缓存问题的快速解决方法(get方式)
2014/01/09 Javascript
js实现导航吸顶效果
2017/02/24 Javascript
利用prop-types第三方库对组件的props中的变量进行类型检测
2017/05/02 Javascript
vue组件间通信子与父详解(二)
2017/11/07 Javascript
ReactNative之FlatList的具体使用方法
2017/11/29 Javascript
vuejs实现ready函数加载完之后执行某个函数的方法
2018/08/31 Javascript
实例分析vue循环列表动态数据的处理方法
2018/09/28 Javascript
vue中v-text / v-html使用实例代码详解
2019/04/02 Javascript
JS实现骰子3D旋转效果
2019/10/24 Javascript
Python开发编码规范
2006/09/08 Python
Python中获取对象信息的方法
2015/04/27 Python
解决python3捕获cx_oracle抛出的异常错误问题
2018/10/18 Python
python面试题小结附答案实例代码
2019/04/11 Python
Python三元运算与lambda表达式实例解析
2019/11/30 Python
Django+boostrap 美化admin后台的操作
2020/03/11 Python
HTML5如何为形状图上颜色怎么绘制具有颜色和透明度的矩形
2014/06/23 HTML / CSS
德国体育用品网上商店:SC24.com
2016/08/01 全球购物
捷克移动配件网上商店:ProMobily.cz
2019/03/15 全球购物
运动会通讯稿500字
2014/02/20 职场文书
职称评定自我鉴定
2014/03/18 职场文书
校庆活动方案
2014/03/31 职场文书
体育节口号
2014/06/19 职场文书
银行招聘自荐信
2015/03/06 职场文书
教师节校长致辞
2015/07/31 职场文书
爱护环境建议书
2015/09/14 职场文书
2016年小学“感恩教师”主题队日活动总结
2016/04/01 职场文书
Redis调用Lua脚本及使用场景快速掌握
2022/03/16 Redis
OpenCV项目实践之停车场车位实时检测
2022/04/11 Python