首页 > 代码库 > [Python]socket使用
[Python]socket使用
Python socket可以实现socket通信功能,还可以与php, js等程序进行socket通信,达到在网页中嵌入Python程序的目的。
Python中使用socket模块完成socket通信功能,其提供底层的套接字访问接口。
创建套接字对象
sock = socket.socket(family, type)
family指明协议家族
socket.AF_UNIX(unix域,用于同一台机器上进程间通讯)
socket.AF_INET(IPv4)
type 指明数据流格式
socket.SOCK_STREAM(流套接字)
socket.SOCK_DGRAM(数据报文套接字)
socket.SOCK_RAW(raw套接字)。
建立连接
服务器端
绑定端口
sock.bind((host,port))
#包含地址与端口的元组参数
监听
sock.listen(backlog)
这里的backlog指代最大链接数。所有的链接保存在一个队列中,以FIFO的顺序执行。
连接
connection,address = sock.accept()
sock调用accept()时,系统进入waiting状态,等待连接。有连接时,返回一个元组,元组中包含connection(连接套接字),address(连接地址)
客户端
连接
sock.connect((host,port))
收发数据
使用sock.send()和sock.recv()来收发数据。
send()返回值为已发送数据个数
recv(maxn)必须加上每次接受的最大数据量,进入block状态,函数返回值为收到的数据字符串。
如果想要发送如数组,字典这种数据结构,这可考虑使用json格式来进行数据转换发送。
json
json(java script object notation),是一种统一格式的数据,用于数据传输。json格式实际就是字符串,只不过它把其他复杂的数据结构解构为字符串传输,并可在接收端又重构回来。
Python使用json或者simplejson模块处理json格式
如下四个函数:
simpeljson.dumps() python object ->str
simpeljson.dump() file -> str
simpeljson.loads() str -> python object
simpeljson.load() str -> file
例子
# _*_ coding:utf-8 _*_ import simplejson dic = {"ha": 1, "la": 2} st = simplejson.dumps(dic) #dumps()把Python object转化为字符串 print type(st) print st dict_1 = simplejson.loads(st) #loads()函数把解构得到的字符串重构为字典格式 print type(dict_1) print dict_1
#结果为
<type 'str'> {"ha": 1, "la": 2} <type 'dict'> {u'ha': 1, u'la': 2}
*注,simplejson可处理的两种Python数据结构:
字典,数组
时延处理
在收发数据的时候,sock进入block阶段,等待收发完成。我们需要设置一个最大时间来终止失败的,或者时延过长的收发。
在socket执行任意函数前,加上
sock.settimeout(time),time为最大时限,单位是s。
其之后的操作大于这个时限就会抛出异常。
如:
try: sock.settimeout(10) buf = sock.recv(1024) except sock.timeout: print “time out”
关闭
sock.close()
#关闭socket
实例
这里用socket进行通信,用json格式传输数据
service 端:
# _*_ coding:utf-8 _*_ __author__ = 'Patrick' import simplejson import socket import sys if __name__ == '__main__': sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) try: sock.bind(('localhost', 3369)) sock.listen(100) except: print "ip or port error" sys.exit() while True: con, add = sock.accept() print 'Got connection from ', add buf = con.recv(1024) print 'buf type', type(buf) dic = simplejson.loads(buf) print 'after loads', type(dic) print dic con.close()
client端:
# _*_ coding:utf-8 _*_ __author__ = 'Patrick' import simplejson import socket import sys if __name__ == '__main__': sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) try: sock.connect(('localhost', 3369)) except: print "connect error" sys.exit() dic = {"haha": 1, "lala": 2} print 'dic type ', type(dic) st = simplejson.dumps(dic) print 'after dumps ',type(st) sock.send(st) sock.close()
服务器端结果:
buf type <type ‘str‘>
after loads <type ‘dict‘>
{u‘haha‘: 1, u‘lala‘: 2}
客户端结果:
dic type <type ‘dict‘>
after dumps <type ‘str‘>