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()
|