Errno 111:仅在python IDLE中拒绝连接

时间:2016-03-23 12:07:57

标签: python linux sockets

当我尝试在Linux终端中执行Python服务器套接字程序和客户端套接字程序(都在同一个linux机器上运行)时,我没有收到任何错误,服务器接受连接并将数据发送到客户端成功。

但是当我在python IDLE中执行相同的程序时,我得到“ [Errno 111]连接拒绝”错误。

两次执行有什么区别?

我在服务器中使用serversock.bind(('',port#)) 在客户端我正在使用clientsock.connect(('localhost',port#))

Server.py

import socket

serversock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
host = ''
print host
port = 5800
serversock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
serversock.bind((host,port))
serversock.listen(2)

try:
    while True:
        csock,addr = serversock.accept()
        print 'Recieved address from %s '% str(addr)
        csock.send('hello')
        csock.close()

except Exception,e:
    print e

client.py

import socket

 try:
   c = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
   host = 'localhost'
   port = 5800
   c.connect((host,port))
   data = c.recv(1024)
   print data

except Exception,e:
   print e

finally:
   c.close()

1 个答案:

答案 0 :(得分:1)

服务器端必须使用:

serversock.bind(('',port#))    # binds to port
serversock.listen(5)           # actually listen to port and allow 5 incoming calls
conv = serversock.accept()     # accept first incoming call

只有listen之后才会接受连接,在此之前,您只绑定了一个套接字,但尚未声明您已准备好接受来电,因此拒绝接听。

添加代码后,另一个可能的错误原因是您在发送数据后立即关闭连接(服务器端)。这很糟糕:关闭条件可能会在数据实际发送之前销毁套接字。

您应该使用graceful shutdown

  • 服务器端:

    csock.send('hello')
    csock.shutdown(socket.SHUT_WR) # shutdown the socket
    csock.read() # wait the close from peer
    csock.close()
    
  • 客户端:您可以将代码保留在用例中,不要向服务器发送任何内容,因此当客户端完成读取后,可以安全地关闭套接字

无论如何,你应该在一切都完成后关闭serversock

try:
    ...
except ...:
    ...
finally:
    serversock.close()