我正在学习如何使用线程和套接字连接。 我在网上找到了有关线程和套接字连接如何工作的文献和示例。现在我尝试将两者合并在一起以创建一个简单的发送/接收应用程序。所以这就是我作为一个例子放在一起的例子:
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
答案 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),并没有遇到我之前遇到的虚假错误。
谢谢大家的帮助。我在理解线程和套接字如何协同工作方面获得了更多。