Python连接由P重置

2024-03-29 01:50:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图让一个简单的主机/客户端传输工作。我遵循了一个教程,服务器正常运行,但是当客户端尝试连接时,它返回“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)

Tags: selfprefixlenifbytesportdefmsg
2条回答
newsock, clientaddr = oldsock.accept()
while True:
    print newsock.recv(100), "from", clientaddr[0], "on port", clientaddr[1]

当OS接收到侦听端口上的连接时,OS将端口切换到新的空闲端口。 这样,您就可以继续监听您的端口以获得新的连接,同时使用刚刚到达的端口。 插座.接受()将等待连接到来,然后返回绑定到新端口的新套接字和元组(address,port),其中address是客户端的IP,port是OS内部提供的新端口。 因此,如果您想取消accept()方法与receive()的关联,则必须将新套接字保存在某个属性中。 或者像garph0所说的那样作为一个论据。在

据我所知,当客户端断开连接时,recv()将抛出一个错误。然后你打电话来newsock.关闭(),或者当你想在客户面前把门关上的时候,你就叫它。然后你平静地继续等待新的。在

socket.accept()将返回一个用于发送和接收的套接字对象。看看the docs。在

例如:

def accept(self):
    conn, addr = self.sock.accept()
    while True:
        print (self.recieve(conn))

并更改self.recieve()以使用新的套接字。在

此外,此实现在为第一个客户机提供服务时不会接受()任何新客户机,但是您可以为listen()调用指定大于零的maxcon值。在

这将使任何新的客户机(最多maxcon值)成功连接,然后排队等待服务,但是这个实现看起来像是在客户端停止连接时就退出了(尽管我没有仔细检查:)),所以最好给listen()一个零backlog值。在

相关问题 更多 >