socket Service-Client

清华大佬耗费三个月吐血整理的几百G的资源,免费分享!....>>>

#!/usr/bin/env python
# coding: utf-8
#
# author: Tim Wang
# date: 2015-05-21
# filename: common_lib/net/sockettools.py

import socket
import sys
from thread import start_new_thread
import cPickle as pickle


def mksocket():
    try:
        return socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    except socket.error, msg:
        print 'Failed to create socket. Error code: %s ,' % msg[0]
        print 'Error message : %s' % msg[1]
        sys.exit(1)


def clientthread(conn, func):
    while True:
        data = conn.recv(1024)
        if not data or not data.strip():
            break
        conn.sendall(func(eval(data)))
    print "Peer:", conn.getpeername(),
    conn.close()
    print "disconnect."


def pkl(func):
    def _wrap(argkwg):
        args, kwgs = argkwg
        result = func(*args, **kwgs)
        return pickle.dumps(result)
    return _wrap


class SocketService(object):

    def __init__(self, addr, listen=10, func=None):
        self.addr = addr
        self.sock = mksocket()
        self.func = None
        try:
            self.sock.bind(self.addr)
        except socket.error, msg:
            print 'bind failed. error: [%d] %s' % (msg[0], msg[1])
            sys.exit(2)
        self.sock.listen(listen)
        self.register(func)

    def register(self, fn):
        default = lambda x: 'OK...' + x
        self.func = fn or default

    def sloop(self, func=None):
        if func:
            self.register(func)
        while 1:
            conn, addr = self.sock.accept()
            print addr, "connected."
            start_new_thread(clientthread, (conn, self.func))
        self.sock.close()


class SocketAgent(object):

    def __init__(self, addr):
        self.addr = addr
        self.sock = mksocket()
        self.sock.connect(self.addr)

    def __call__(self, *args, **kwgs):
        self.sock.sendall(repr((args, kwgs)))
        return pickle.loads(self.sock.recv(4096))

    def __del__(self):
        self.sock.close()