PythonTip >> 博文 >> python

[Python]socket使用

zihua 2014-08-21 10:08:58 点击: 2833 | 收藏


Python socket 可以实现 socket 通信功能,还可以与 php, js 等程序进行 socket 通信,达到在网页中嵌入 Python 程序的目的。

Python 中使用 socket 模块完成 socket 通信功能,其 提供底层的套接字访问接口。

创建套接字对象

sock = socket.socket(family, type)

family 指明协议家族

AF_UNIX(unix 域,用于同一台机器上进程间通讯 )

AF_INET(IPv4)

type  指明数据流格式

SOCK_STREAM( 流套接字 )

SOCK_DGRAM (数据报文套接字)

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'>

原文链接:http://www.tuicool.com/articles/mYruai

作者:zihua | 分类: python | 标签: python | 阅读: 2833 | 发布于: 2014-08-21 10时 |