pythonsocket编程
❶ python中使用socket编程,如何能够通过UDP传递一个列表类型的数据
Python中的 list 或者 dict 都可以转成JSON字符串来发送,接收后再转回来。
首先
importjson
然后,把 list 或 dict 转成 JSON
json_string=json.mps(list_or_dict)
如果你用的是Python3,这里的 json_string 会是 str 类型(即Python2的unicode类型),可能需要编码一下:
if type(json_string) == six.text_type:
json_string = json_string.encode('UTF-8')
用socket发送过去,例如
s.sendto(json_string,address)
对方用socket接收,例如
json_string,addr=s.recvfrom(2048)
把JSON转成 list 或 dict
list_or_dict=json.loads(json_string)
下面是个完整的例子:
client.py
#!/usr/bin/envpython
#-*-coding:UTF-8-*-
importsocket
importjson
importsix
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.mps(mylist)
iftype(json_string)==six.text_type:
json_string=json_string.encode('UTF-8')
s.sendto(json_string,address)
s.close()
server.py
#!/usr/bin/envpython
#-*-coding:UTF-8-*-
importsocket
importjson
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异步网络编程怎么使socket关闭之后立即执行一段代码
自己实现MySocket类,继承自socket,然后重写它的close方法,在里面调用父类close方法,再加上你自己想做的工作,其他不要动。
❸ 以封装成帧的形式传送多个文件python网络编程
摘要 import socket #网路编程模块
❹ python的socket编程问题
struct在unpack的时候用大端方式读取,先读一个B,也就是一个字节作为类型,然后读一个H,也就是大端的两字节作为版本,然后是大段的两字节作为ln什么的。
很多脚本语言都支持pack,unpack来序列化数据的,你要查一下具体的字符的含义。
❺ python socket编程中listen和accept的区别
listen函数在一般在调用bind之后-调用accept之前调用,它的函数原型是:
intlisten(int sockfd, int backlog)
参数sockfd
被listen函数作用的套接字,sockfd之前由socket函数返回。在被socket函数返回的套接字fd之时,它是一个主动连接的套接字,也就是此时系统假设用户会对这个套接字调用connect函数,期待它主动与其它进程连接,然后在服务器编程中,用户希望这个套接字可以接受外来的连接请求,也就是被动等待用户来连接。由于系统默认时认为一个套接字是主动连接的,所以需要通过某种方式来告诉系统,用户进程通过系统调用listen来完成这件事。
参数backlog
这个参数涉及到一些网络的细节。进程处理一个一个连接请求的时候,可能还存在其它的连接请求。因为TCP连接是一个过程,所以可能存在一种半连接的状态,有时由于同时尝试连接的用户过多,使得服务器进程无法快速地完成连接请求。如果这个情况出现了,服务器进程希望内核如何处理呢?内核会在自己的进程空间里维护一个队列以跟踪这些完成的连接但服务器进程还没有接手处理或正在进行的连接,这样的一个队列内核不可能让其任意大,所以必须有一个大小的上限。这个backlog告诉内核使用这个数值作为上限。
毫无疑问,服务器进程不能随便指定一个数值,内核有一个许可的范围。这个范围是实现相关的。很难有某种统一,一般这个值会小30以内。
accept函数
摘要:accept()用来接受参数s的socket连接,它的函数原型是:
intaccept(int s,struct sockaddr * addr,int * addrlen)
服务程序调用accept函数从处于监听状态的流套接字s的客户连接请求队列中取出排在最前的一个客户请求,并且创建一个新的套接字来与客户套接字创建连接通道,如果连接成功,就返回新创建的套接字的描述符,以后与客户套接字交换数据的是新创建的套接字;如果失败就返回 INVALID_SOCKET。该函数的第一个参数指定处于监听状态的流套接字;操作系统利用第二个参数来返回新创建的套接字的地址结构;操作系统利用第三个参数来返回新创建的套接字的地址结构的长度。
❻ 求完整的用python语言实现socket编程,完成数据的发送,接收转发的程序!!急!!!谢谢!!
http://hi..com/bqlymjtdjsbcjtd/item/c7a718cdf44f715abcef6900 应该有点参考价值
❼ 用python进行socket编程老是报错error: [Errno 10061] 怎么回事啊好心人帮帮忙啊!!在线等!谢了
出现Errno10061 是因为目标主机主动拒绝,连接不能建立。
这通常是因为试图连接到一个远程主机上不活动的服务,如没有服务器应用程序处于执行状态。
解决方法:
1)你先启动server,看是否可以正常启动。
2)因为是基于TCP的,所以你试试telnet可否链接到server上,格式为 telnet 127.0.0.1 5007 如果telnet没有找到的话,就配置下启动telnet。
3) 如果telnet没有成功的话,则看下是否允许python访问网络,在控制面板里配置下,如果不是要允许访问。
4)最后,服务端自己的监听地址和客户端书写的服务端地址形式必须要完全对应,或者服务端地址写成空字符串”“形式,表示所有可用地址。程序才能正常传输文件。
意思就是:
1.服务端和客户端要在一台主机上做测试的话,要不全写成"localhost"或者全写成"127.0.0.1"形式,要不全写成自己的内网IP或外网IP,如"192.168.0.10"形式;
2.不在同一个主机上的话,服务端本地地址不能写成"127.0.0.1"或者"localhost",而要写成自己的内网IP或外网IP形式。
3.最简单一种方法:服务端地址写成""形式。
❽ Python网络编程
在当今Python服务器框架 (framework, 比如Django, Twisted, web.py等等) 横行的时代,从底层的socket开始写服务器似乎是一个出力不讨好的笨方法。框架的意义在于掩盖底层的细节,提供一套对于开发人员更加友好的API,并处理诸如MVC的布局问题。框架允许我们快速的构建一个成型而且成熟的Python服务器。然而,框架本身也是依赖于底层(比如socket)。对于底层socket的了解,不仅可以帮助我们更好的使用框架,更可以让我们明白框架是如何设计的。更进一步,如果拥有良好的底层socket编程知识和其他系统编程知识,你完全可以设计并开发一款自己的框架。如果你可以从底层socket开始,实现一个完整的Python服务器,支持用户层的协议,并处理好诸如MVC(Model-View-Control)、多线程(threading)等问题,并整理出一套清晰的函数或者类,作为接口(API)呈现给用户,你就相当于设计了一个框架。socket接口是实际上是操作系统提供的系统调用。socket的使用并不局限于Python语言,你可以用C或者JAVA来写出同样的socket服务器,而所有语言使用socket的方式都类似(Apache就是使用C实现的服务器)。而你不能跨语言的使用框架。框架的好处在于帮你处理了一些细节,从而实现快速开发,但同时受到Python本身性能的限制。我们已经看到,许多成功的网站都是利用动态语言(比如Python, Ruby或者PHP,比如twitter和facebook)快速开发,在网站成功之后,将代码转换成诸如C和JAVA这样一些效率比较高的语言,从而让服务器能更有效率的面对每天亿万次的请求。在这样一些时间,底层的重要性,就远远超过了框架。
❾ Python的socket编程recv(1024)为什么收不到数据
原来Python的socket.recv(n)函数,并没有真正将我们希望接收的数据字长n全部接收,只需要保证Python将我们希望接收的所有长度接收即可。那么根据需求,我们自己实现一个接收的函数即可:
#------------------------------------------------------# RecvN# recv N bytes to target
#------------------------------------------------------def RecvN(socket, n):
totalContent = b''
totalRecved = 0
while totalRecved < n:
onceContent = socket.recv(n - totalRecved)print("onceContent", onceContent)totalContent += onceContent
totalRecved = len(totalContent)
return totalContent
# data = sockfd.recv(30 * 1024 + 14)
data = RecvN(sockfd, 30 * 1024 + 14)
这样的话,就可以把我们所有需要接收的字长接收了。