
python中使用socket编程,如何能够通过UDP传递一个列表类型的数据?
譬如,我有一个a=[1,2,3,4,5,......]很长的一个列表,有什么好的办法通过UDP传递么?...
譬如,我有一个a = [1,2,3,4,5, ......]很长的一个列表,有什么好的办法通过UDP传递么?
展开
2个回答
展开全部
Python中的 list 或者 dict 都可以转成JSON字符串来发送,接收后再转回来。
首先
1 | import json |
然后,把 list 或 dict 转成 JSON
1 | json_string = json.dumps(list_or_dict) |
如果你用的是Python3,这里的 json_string 会是 str 类型(即Python2的unicode类型),可能需要编码一下:
if type(json_string) == six.text_type:
json_string = json_string.encode('UTF-8')
用socket发送过去,例如
1 | s.sendto(json_string, address) |
对方用socket接收,例如
1 | json_string, addr = s.recvfrom( 2048 ) |
把JSON转成 list 或 dict
1 | list_or_dict = json.loads(json_string) |
下面是个完整的例子:
client.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #!/usr/bin/env python # -*- coding: UTF-8 -*- import socket import json import six address = ( '127.0.0.1' , 31500 ) s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) mylist = [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ] json_string = json.dumps(mylist) if type (json_string) = = six.text_type: json_string = json_string.encode( 'UTF-8' ) s.sendto(json_string, address) s.close() |
server.py
1 2 3 4 5 6 7 8 9 10 11 12 13 | #!/usr/bin/env python # -*- coding: UTF-8 -*- import socket import json address = ( '127.0.0.1' , 31500 ) s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.bind(address) json_string, addr = s.recvfrom( 2048 ) mylist = json.loads(json_string) print (mylist) s.close() |
请先运行server.py,再运行client.py
追问
那这种办法就是说客户端、服务器都要是用python编写了吗?
追答
没有啊,你要用其它语言写也行啊。比如你用PHP语言,client依然用上面的 client.py 代码,然后 server.php 的代码是:
1 2 3 4 5 6 7 8 9 10 | <?php $socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); socket_bind( $socket , '127.0.0.1' , 31500); $name = '' ; $port = 0; $json_string = '' ; socket_recvfrom ( $socket , $json_string , 2048 , 0, $name , $port ); $mylist = json_decode( $json_string , true); var_dump( $mylist ); ?> |
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询