我试图让一个简单的主机/客户端传输工作。我遵循了一个教程,服务器正常运行,但是当客户端尝试连接时,它返回“connectionresetbypeer”,我真的不知道错误在哪里。在
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)
当OS接收到侦听端口上的连接时,OS将端口切换到新的空闲端口。 这样,您就可以继续监听您的端口以获得新的连接,同时使用刚刚到达的端口。 插座.接受()将等待连接到来,然后返回绑定到新端口的新套接字和元组(address,port),其中address是客户端的IP,port是OS内部提供的新端口。 因此,如果您想取消accept()方法与receive()的关联,则必须将新套接字保存在某个属性中。 或者像garph0所说的那样作为一个论据。在
据我所知,当客户端断开连接时,recv()将抛出一个错误。然后你打电话来newsock.关闭(),或者当你想在客户面前把门关上的时候,你就叫它。然后你平静地继续等待新的。在
socket.accept()
将返回一个用于发送和接收的新套接字对象。看看the docs。在例如:
并更改
self.recieve()
以使用新的套接字。在此外,此实现在为第一个客户机提供服务时不会接受()任何新客户机,但是您可以为
listen()
调用指定大于零的maxcon
值。在这将使任何新的客户机(最多
maxcon
值)成功连接,然后排队等待服务,但是这个实现看起来像是在客户端停止连接时就退出了(尽管我没有仔细检查:)),所以最好给listen()
一个零backlog值。在相关问题 更多 >
编程相关推荐