[英]Python Connection Reset by Peer
我正在尝试进行简单的主机/客户端传输。 我遵循了一个教程,服务器正常运行,但是当客户端尝试连接时,它返回“对等连接重置”。 老实说,我不知道错误在哪里。
class genSocket:
def __init__(self, sock=None):
if sock is None:
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
else:
self.sock = sock
def bind(self, ip, port):
self.sock.bind((ip, port))
def listen(self, maxcon):
self.sock.listen(maxcon)
while True:
self.sock.accept()
def accept(self):
self.sock.accept()
while True:
print (self.recieve())
def connect(self, host, port):
self.sock.connect((host, port))
def send(self, msg, type):
totalsent = 0
prefix = str(type) + str(len(msg)).rjust(5, '0')
print prefix
while totalsent < 6:
sent = self.sock.send(prefix)
if sent == 0:
raise RuntimeError("Connection broken!")
print "sent prefix"
totalsent = 0
while totalsent < len(msg):
sent = self.sock.send(msg[totalsent:])
if sent == 0:
raise RuntimeError("Connection broken!")
totalsent = + sent
def recieve(self):
bytes_recd = 0
while bytes_recd < 6:
prefix = self.sock.recv(6)
if prefix == '':
raise RuntimeError("Connection broken!")
prefix.append(prefix)
bytes_recd = + len(prefix)
print "recieved prefix"
chunks = []
msglen = prefix[1:]
bytes_recd = 0
while bytes_recd < msglen:
chunk = self.sock.recv(min(msglen - bytes_recd, 2048))
if chunk == '':
raise RuntimeError("Connection broken!")
chunks.append(chunk)
bytes_recd = + len(chunk)
return ''.join(chunks)
socket.accept()
将返回一个新的套接字对象,您需要使用该对象进行发送和接收。 看一下文档 。
例如:
def accept(self):
conn, addr = self.sock.accept()
while True:
print (self.recieve(conn))
并更改self.recieve()
以使用新的套接字。
同样,该实现不会在服务第一个新客户端时接受任何新客户端,但是您可以为listen()
调用指定大于零的maxcon
值。
这将使任何新客户端(最大为maxcon
值)成功连接,然后排队等待服务,但是这种实现方式看起来像是在客户端停止连接时就退出了(尽管我没有仔细检查,但是: )),因此最好将listlog listen()
积压值设为零。
newsock, clientaddr = oldsock.accept()
while True:
print newsock.recv(100), "from", clientaddr[0], "on port", clientaddr[1]
当OS在侦听端口上接收到连接时,OS会将端口切换为新的空闲端口。 这样,您可以在与刚到达的端口一起工作时继续侦听端口的新连接。 socket.accept()将等待,直到该连接到来,然后它将为您返回绑定到新端口的新套接字和一个元组(地址,端口),其中地址是客户端的IP,而端口是操作系统的新端口内部给予。 因此,如果您打算将accept()方法与receive()取消关联,则必须将该新套接字保存在某个属性中。 或将其作为garph0所说的参数传递。
据我所知,当客户端断开连接时,recv()将引发错误。 然后,您调用newsock.close(),或者在您希望关闭客户鼻子的门时调用它。 然后,您从容地继续等待新的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.