首页 > 代码库 > [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_RAWraw套接字)。

建立连接


服务器端

绑定端口

sock.bind((host,port))

#包含地址与端口的元组参数

监听

sock.listen(backlog)

这里的backlog指代最大链接数。所有的链接保存在一个队列中,以FIFO的顺序执行。

连接

connectionaddress = 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‘>