Python - 错误:[Errno 111]连接被拒绝和错误:[Errno 98]地址已被使用

时间:2015-12-03 18:47:07

标签: python multithreading python-2.7 sockets

我正在学习如何使用线程和套接字连接。 我在网上找到了有关线程和套接字连接如何工作的文献和示例。现在我尝试将两者合并在一起以创建一个简单的发送/接收应用程序。所以这就是我作为一个例子放在一起的例子:

main.py,

import server
import client
import threading

def main():
    try:
        threadA = threading.Thread(target=server.serv)
        threadA.start()

        threadB = threading.Thread(target=client.client)
        threadB.start()
    except:
        print "Got an Error"

if __name__ == '__main__':
    main()
  

server.py

#!/usr/bin/python           # This is server.py file

import socket               # Import socket module

def serv():
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)         # Create a socket object
host = socket.gethostname() # Get local machine name
port = 12920                # Reserve a port for your service.
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

s.bind((host, port))        # Bind to the port

s.listen(5)                 # Now wait for client connection.
#while True:
c, addr = s.accept()     # Establish connection with client.
print 'Got connection from', addr
c.send('Thank you for connecting')
s.shutdown(1)
c.close()                # Close the connection
  

client.py

#!/usr/bin/python           # This is client.py file

import socket               # Import socket module

def client():
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)         # Create a socket object
    s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    host = socket.gethostname() # Get local machine name
    port = 12920                # Reserve a port for your service.

    s.connect((host, port))
    print s.recv(1024)
    s.shutdown(1)
    s.close                     # Close the socket when done

我能够第一次运行应用程序而没有任何错误。这是输出: 得到了连接(' 172.17.132.98',50759)
感谢您的连接

当我再次运行应用程序时(连续第二次),我收到以下错误:

Traceback (most recent call last):                                                                                                                                 
File "/usr/lib64/python2.7/threading.py", line 813, in __bootstrap_inner                                                                                         
       self.run()                                                                                                                                                     
File "/usr/lib64/python2.7/threading.py", line 766, in run                                                                                                       
    self.__target(*self.__args, **self.__kwargs)                                                                                                                   
File "/home/cg/root/client.py", line 12, in client                                                                                                               
    s.connect((host, port))                                                                                                                                        
File "/usr/lib64/python2.7/socket.py", line 228, in meth                                                                                                         
    return getattr(self._sock,name)(*args)                                                                                                                         
error: [Errno 111] Connection refused  

这里我点击了ctrl + Z键来暂停挂起的应用程序。

如果我再次尝试运行该应用程序,则会收到以下错误: 线程Thread-1中的异常:

Traceback (most recent call last):                                                                                                                                 
  File "/usr/lib64/python2.7/threading.py", line 813, in __bootstrap_inner                                                                                         
    self.run()                                                                                                                                                     
  File "/usr/lib64/python2.7/threading.py", line 766, in run                                                                                                       
    self.__target(*self.__args, **self.__kwargs)                                                                                                                   
  File "/home/cg/root/server.py", line 11, in serv                                                                                                                 
    s.bind((host, port))        # Bind to the port                                                                                                                 
  File "/usr/lib64/python2.7/socket.py", line 228, in meth                                                                                                         
    return getattr(self._sock,name)(*args)                                                                                                                         
error: [Errno 98] Address already in use

有人能告诉我我做错了吗?

感谢InAdvance

3 个答案:

答案 0 :(得分:2)

您的客户端代码实际上并未关闭连接。您的代码包含以下内容:

s.close  

应该是:

s.close()

因此,您将在服务器上保持连接打开状态,并且资源未正确释放。这就是您收到地址使用错误的原因。端口仍处于绑定状态,并且正在使用"。

此外,如果您使用" Ctrl + Z"暂停应用程序,它仍在后台执行,资源尚未释放。您需要实际终止进程以释放资源。

答案 1 :(得分:0)

  

这里我点击了ctrl + Z键来暂停挂起的应用程序。

有你的问题。要停止应用程序,您必须按ctrl + c;用ctrl + z你只需将它发送到后台。应用程序仍处于打开状态并使用相同的地址和端口。

如果您将某个应用程序发送到后台,则可以使用fg将其恢复,并使其bg在后​​台运行,或者使用kill %1将其终止。杀死它(或将它带回前台并用ctrl + c停止它)应该释放资源。

答案 2 :(得分:0)

我发现我的例子,起始threadA和threadB之间存在时间问题。服务器和客户端之间的竞争条件。所以我在它们之间添加了一个threading._sleep(1),并没有遇到我之前遇到的虚假错误。

谢谢大家的帮助。我在理解线程和套接字如何协同工作方面获得了更多。