服务器客户端通信 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的主要内容,如果未能解决你的问题,请参考以下文章

Android客户端与Python服务器端通信之上传图片

Python 多线程服务器和与 Android 客户端的异步 websocket 通信

Python 使用socket实现一对多通信

Python socket编程客户端与服务端通信

python模拟服务端和客户端通信(简单)

Python 脚本与将内容传输到客户端的 Python Flask 服务器通信的最佳方式是啥?