【问题标题】:Errno 111: Connection refused only in python IDLEErrno 111:仅在 python IDLE 中拒绝连接
【发布时间】:2016-03-23 12:07:56
【问题描述】:

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

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

这两种执行方式有什么区别?

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

服务器.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()

【问题讨论】:

    标签: python linux sockets


    【解决方案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调用之后才会接受连接,在它之前,你只绑定了一个socket,但还没有声明你准备好接受来电,所以它们被拒绝了。


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

    你应该使用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()
    

    【讨论】:

    • 嗨,我已经添加了我之前所说的所有调用,我的问题是不同的,当我在 Linux 终端套接字编程中执行时,但是当在 python idle 中执行相同的服务器和客户端时,我得到了上面错误
    • @sanyesh:您没有显示要收听的电话。您是否确认在调用连接客户端之前将其称为服务器端?
    • 嗨@Serge Ballesta,请找到我在问题中添加的程序。
    • @sanyesh:您忘记在服务器代码中关闭serversock,但这不会导致此错误。在 IDLE 中如何执行?
    • @sanyesh 在我的回答中带有代码以及我给你的链接应该能够理解客户端应该做什么。而 Python 库手册将比我更好地解释 shutdown 方法...
    猜你喜欢
    • 2012-07-20
    • 1970-01-01
    • 1970-01-01
    • 2019-12-13
    • 2020-11-22
    • 2014-09-14
    • 2021-06-08
    • 2021-08-23
    相关资源
    最近更新 更多