Python调用远程Socket接口

Web应用通信通常都喜欢用HTTP接口,但不排除直接socket通信的情况。

socket除了server端构建麻烦些(需要考虑很多实际情况),对于调用者来说构建个client端其实不比http麻烦多少。

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Auther: linvo

import socket


class Client(object):
    """
    调用远程Socket接口
    <code>
    try:
        obj = Client(host, port)
        ret = obj.send(data)
    except Exception, e:
        ret = e
    </code>
    """
    def __init__(self, host, port, timeout = 5):
        """
        链接远程接口服务
        """
        self.sock = None
        try:
            socket.setdefaulttimeout(timeout) 
            self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
            self.sock.connect((host, port))
        except socket.error, e:
            raise Exception('SOCKET ERROR:' + str(e))
        except Exception, e:
            raise Exception('CONNECT ERROR:' + str(e))



    def send(self, data):
        """
        socket通信
        发送和接收
        data: 发送的数据
        ret: 接收的数据
        """
        ret = None
        # 链接成功,开始传输
        if self.sock:
            data = str(data)
            try:
                result = self.sock.sendall(data)
            except Exception, e:
                result = str(e)

            if result is not None:
                raise Exception('SEND ERROR:' + str(result))
            else:
                # 接收 
                ret = ''
                try:
                    while True:
                        buffer = self.sock.recv(2048)
                        if buffer: 
                            ret += buffer
                        else:
                            break
                except Exception, e:
                    raise Exception('RECV ERROR:' + str(e))
        return ret

顺便给个简易的server端,以便测试:

import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('localhost', 9801))
sock.listen(5)
while True:
    connection, address = sock.accept()
    try:
        connection.settimeout(5)
        buf = connection.recv(2048)
        connection.send(buf)
    except socket.timeout:
        print 'time out'
    connection.close()


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值