Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7771011
  • 博文数量: 701
  • 博客积分: 2150
  • 博客等级: 上尉
  • 技术积分: 13233
  • 用 户 组: 普通用户
  • 注册时间: 2011-06-29 16:28
个人简介

天行健,君子以自强不息!

文章分类

全部博文(701)

文章存档

2019年(2)

2018年(12)

2017年(76)

2016年(120)

2015年(178)

2014年(129)

2013年(123)

2012年(61)

分类: Python/Ruby

2014-08-27 10:03:09

用Python写的一个多线程TCP通信实例,实现了JSON数据的传输。
闲言少述,直接上代码

一、客户端
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#

import socket
import threading
import SocketServer
import json

def client(ip, port, message):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.connect((ip, port))

    try:
        print "Send: {}".format(message)
        sock.sendall(message)
        response = sock.recv(1024)
        jresp = json.loads(response)
        print "Recv: ",jresp

    finally:
        sock.close()

if __name__ == "__main__":
    # Port 0 means to select an arbitrary unused port
    HOST, PORT = "localhost", 50001
    msg1 = [{'src':"zj", 'dst':"zjdst"}]
    msg2 = [{'src':"ln", 'dst':"lndst"}]
    msg3 = [{'src':"xj", 'dst':"xjdst"}]

    jmsg1 = json.dumps(msg1)
    jmsg2 = json.dumps(msg2)
    jmsg3 = json.dumps(msg3)

    client(HOST, PORT, jmsg1)
    client(HOST, PORT, jmsg2)
    client(HOST, PORT, jmsg3)

二、服务端
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#

import socket
import threading
import SocketServer
import json, types,string
import os, time
  
class ThreadedTCPRequestHandler(SocketServer.BaseRequestHandler):
    def handle(self):
        data = self.request.recv(1024)
        jdata = json.loads(data)
        print "Receive data from '%r'"% (data)
        print "Receive jdata from '%r'"% (jdata)
        rec_src = jdata[0]['src']
        rec_dst = jdata[0]['dst']

        cur_thread = threading.current_thread()
        response = [{'thread':cur_thread.name,'src':rec_src,'dst':rec_dst}]

        jresp = json.dumps(response)
        self.request.sendall(jresp)
        rec_cmd = "proccess "+rec_src+" -o "+rec_dst
        print "CMD '%r'" % (rec_cmd)
        os.system(rec_cmd)
           
class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
    pass

if __name__ == "__main__":
    # Port 0 means to select an arbitrary unused port
    HOST, PORT = "localhost", 50001
    
    SocketServer.TCPServer.allow_reuse_address = True
    server = ThreadedTCPServer((HOST, PORT), ThreadedTCPRequestHandler)
    ip, port = server.server_address

    # Start a thread with the server -- that thread will then start one
    # more thread for each request
    server_thread = threading.Thread(target=server.serve_forever)

    # Exit the server thread when the main thread terminates
    server_thread.daemon = True
    server_thread.start()
    print "Server loop running in thread:", server_thread.name
    print " .... waiting for connection"

    # Activate the server; this will keep running until you
    # interrupt the program with Ctrl-C
    server.serve_forever()
阅读(6872) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~