PHP与Python间的Socket通信(Threading)

(部分信息来自《python参考手册》)

一说明

   Socket 是类似于文件的对象,使程序能够接受传入连接,进行传出连接,发送和接收数据。在两台机器进行通信之前,它们都必须创建socket对象。

    常见的协议及端口(这些端口是由操作系统管理的)
    ftp-Data:20,
    ftp-Control:21
    SSH:22,
    Telnet:23
    SMTP:25,
    HTTP:80
    POP3:110
    IMAP:143
    HTTPS:443

    TCP连接过程:

    03489c91f603738deb2d0c69b31bb051f919ece5.jpg
  UPD连接过程:

  7374a6ce3bc79f3d0587e47bbaa1cd11738b29e6.jpg


二 代码

     服务器端 server.py

#coding:utf-8
'''
Socket 服务器端
    常见的协议及端口(这些端口是由操作系统管理的)
    ftp-Data:20,
    ftp-Control:21
    SSH:22,
    Telnet:23
    SMTP:25,
    HTTP:80
    POP3:110
    IMAP:143
    HTTPS:443
'''
import socket,threading
import time,Queue

'''
    任务线程
'''
class TaskThread(threading.Thread):

    '''
        初始化
    '''
    def __init__(self,queue):
        threading.Thread.__init__(self)
        self.queue = queue
    '''
     执行线程
    '''
    def run(self):
        task = self.queue.get() #取出一项任务
        self.doTask(task)

    '''
        做任务
    '''
    def doTask(self,task):
        path = './task/'+task+'.txt'
        fp = open(path,'w')
        fp.write(task)
        fp.close()

'''
'''
def main():

    #Socket
    s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #创建tcp socket
    s.bind(('localhost',9999))#绑定到9999
    s.listen(5) #监听,但只能挂起5以下链接

    #创建队列
    queue = Queue.Queue()
    
    while True:
        client,addr = s.accept()#连接
        addr = str(addr)
        print("从 %s 获取一个连接"%addr) #直接输出到控制台
        timestr = time.ctime(time.time())+"\r\n" #时间羽化输出
        strs = '现在是:'+timestr
        client.send(strs) #发送输数据
        task = str(client.recv(1024))
        cs = '%s 客户端返回的数据为:%s'%(addr,task) #接收客户端数据
        print(cs)
        client.close()

        #任务
        task = task.split('|')
        #将任务写入到队列中
        for i in task:
            queue.put(i)

        #开始线程   
        for i in task:
            t = TaskThread(queue)
            t.setDaemon(True) #子线程随主线程一起退出
            t.start() #启动线程
            t.join(10) #保证每个线程运行,但只等10s

        queue.join() #等所有任务都处理后,再退出
            
if __name__ =='__main__':
    main()

 

  客户端 client.php

<?php
/**
 * Socket PHP客户端
 *
 */
header ( 'Content-type:text/html;charset=utf8' );
$host = 'tcp://localhost:9999';
$fp = stream_socket_client ( $host, $errno, $error, 30 );
if (! $fp)
{
    
    echo "$error ($errno)";
} else
{
    fwrite ( $fp, 'one|two|three' );
    while ( ! feof ( $fp ) )
    {
        echo fgets ( $fp ); #获取服务器返回的内容
    }
    fclose ( $fp );
}   

三  结果

    服务器控制台:

    0d0c95a88226cffc27bdb2f9b9014a90f703eab5.jpg

    客户端浏览器:

    6e63fe35349b033bca19fc9115ce36d3d439bdb7.jpg

转载于:https://my.oschina.net/taisha/blog/37299

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值