我正在努力让简单的主机/客户端转移工作。我按照教程,服务器上升没有问题,但当客户端尝试连接时返回"连接重置由同行。"我真的不知道错误在哪里。
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)
答案 0 :(得分:0)
socket.accept()
将返回您需要用于发送和接收的新套接字对象。看看the docs。
e.g:
def accept(self):
conn, addr = self.sock.accept()
while True:
print (self.recieve(conn))
并更改self.recieve()
以使用新套接字。
此外,此实现不会接受()任何新客户端在为第一个客户端提供服务时,但您可以为maxcon
调用指定大于零listen()
的值。
这会使任何新客户端(最多maxcon
值)成功连接,然后排队等待服务,但是这个实现看起来就像它在客户端停止时退出连接(我没有仔细检查,但:))所以最好给listen()
提供零积压值。
答案 1 :(得分:0)
newsock, clientaddr = oldsock.accept()
while True:
print newsock.recv(100), "from", clientaddr[0], "on port", clientaddr[1]
当OS在侦听端口上收到连接时,OS会将端口切换到新的空闲端口。 通过这种方式,您可以在使用刚刚到达的连接时继续收听端口以获取新连接。 socket.accept()将等到该连接到来,然后它将返回一个绑定到新端口的新套接字,以及一个元组(地址,端口),其中address是客户端的IP并且端口是新端口的OS内部给了。 因此,如果您要将accept()方法与receive()取消关联,则必须将该新套接字保存在某个属性中。 或者将其作为参数传递,如garph0所说。
当客户端断开连接时,recv()会抛出一个错误,据我所知。然后你打电话给newsock.close(),或者当你希望关闭客户端的门时你打电话给它。然后你冷静地继续等待新的。