Python连接重置Python连接

时间:2015-07-15 08:37:12

标签: python sockets

我正在努力让简单的主机/客户端转移工作。我按照教程,服务器上升没有问题,但当客户端尝试连接时返回"连接重置由同行。"我真的不知道错误在哪里。

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)

2 个答案:

答案 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(),或者当你希望关闭客户端的门时你打电话给它。然后你冷静地继续等待新的。