服务器客户端通信 Python
Posted
技术标签:
【中文标题】服务器客户端通信 Python【英文标题】:Server Client Communication Python 【发布时间】:2012-04-17 20:24:08 【问题描述】:服务器
import socket
import sys
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
host= 'VAC01.VACLab.com'
port=int(2000)
s.bind((host,port))
s.listen(1)
conn,addr =s.accept()
data=s.recv(100000)
s.close
客户
import socket
import sys
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
host="VAC01.VACLab.com"
port=int(2000)
s.connect((host,port))
s.send(str.encode(sys.argv[1]))
s.close()
我希望服务器接收客户端发送的数据。
当我尝试这个时出现以下错误
客户方
Traceback(最近一次调用最后一次): 文件“Client.py”,第 21 行,在 s.send(sys.argv[1]) TypeError: 'str' 不支持缓冲区接口
服务器端
文件“Listener.py”,第 23 行,在 数据=s.recv(100000) socket.error: [Errno 10057] 不允许发送或接收数据的请求,因为 ause 套接字未连接并且(当使用 sendto call) 没有提供地址
【问题讨论】:
我认为您可能需要将str
转换为bytes
。
我要这样做 str.encode(sys.argv[1]) 吗?我这样做了,错误已经停止,但数据没有传输。
您还有问题吗?
【参考方案1】:
在服务器中,您使用 listening 套接字来接收数据。它仅用于接受新连接。
改成这样:
conn,addr =s.accept()
data=conn.recv(100000) # Read from newly accepted socket
conn.close()
s.close()
【讨论】:
在客户端仍然给出同样的错误。服务器错误已解决。 但它们是socket
对象上的 recv()
和 send()
方法。【参考方案2】:
您的行s.send
期望接收流对象。你给它一个字符串。用 BytesIO 包装你的字符串。
【讨论】:
我要这样做 str.encode(sys.argv[1]) 吗?我这样做了,错误已经停止,但数据没有传输。【参考方案3】:您使用的是哪个版本的 Python?从错误消息中,我猜您无意中使用了 Python3。你可以用 Python2 试试你的程序,应该没问题。
【讨论】:
Vinod - 用 Python2 试试,然后就知道区别了。【参考方案4】:尝试将客户端套接字更改为:
s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
【讨论】:
以上是关于服务器客户端通信 Python的主要内容,如果未能解决你的问题,请参考以下文章