我正在尝试创建一个与我的服务器交互的聊天客户端。为了做到这一点,我使用_thread模块中的一个线程允许发送和接收同时运行。但是,当我启动该程序时,我什么都没得到。没有允许收到的消息,也没有提示发送任何消息。怎么了?
代码:
import socket
from _thread import *
host = 'localhost'
port = 9999
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((host,port))
'''while True:
sock.send(input('REPLY: ').encode('utf-8'))
print(str(sock.recv(1000)))
'''
x = None
def sendMess(x):
print('sendMess started')
while True:
x = input("SEND: ")
sock.send(x.encode("utf-8"))
return
def recvMess(x):
print('recvMess started.')
while True:
data = sock.recv(4000)
print(str(data))
return
if sock:
start_new_thread(sendMess, (x,))
start_new_thread(recvMess, (x,))
答案 0 :(得分:2)
首先,您不应再使用_thread
模块,请使用更高级别的threading
模块。
您的示例中的问题是,在启动线程后,主线程退出。
_thread
文档警告您:
<强>注意事项强>:
[...]
- 当主线程退出时,系统定义其他线程是否存活。在大多数系统上,它们在没有执行try ... finally子句或执行对象析构函数的情况下被杀死。
这意味着你的线程在真正做任何工作之前就被销毁了。 threading.Thread
个对象在这里表现不同,除非设置了daemon
标记,否则它们不会被销毁。
要使其正常工作,只需更改您的代码:
import socket
from threading import Thread
...
if sock:
Thread(target=sendMess, args=(x,)).start()
Thread(target=recvMess, args=(x,)).start()