Multithreading Python3多线程socket.send()/socket.recv()不';行不通

Multithreading Python3多线程socket.send()/socket.recv()不';行不通,multithreading,sockets,python-3.6,Multithreading,Sockets,Python 3.6,server.py代码: import socket import _thread import sys s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.bind(('x.x.x.x', xxxx)) s.listen(1) print("Server is running.") c, a = s.accept(

server.py代码:

import socket
import _thread
import sys

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

s.bind(('x.x.x.x', xxxx))

s.listen(1)

print("Server is running.")

c, a = s.accept()
print('[+] CONNECTED: {}:{} [+]'.format(a[0],a[1]))
c.send(b'[+] CONNECTED [+]\n')

def recv():
    while 1:
        data = c.recv(4096).decode("UTF-8")
        if not data: sys.exit(0)
        print(data)


def send():
    while 1:
        msg = input("Msg: ")
        c.send(msg.encode('UTF-8'))

_thread.start_new_thread(send(), ())
_thread.start_new_thread(recv(), ())

c.close()
s.close()
用谷歌搜索这个问题,我想我做到了应该做到的。然而,它似乎不起作用

无论是将send()还是recv()设置为第一个,我都会被其中一个卡住,而它不会让另一个运行。就像我在没有线程模块的情况下使用这些函数一样

有人能解释我犯了什么错误吗?谢谢


(顺便说一句,我正在使用netcat连接到服务器,如果这些信息有用的话)

线程可能很复杂,因此我将尝试分析可能发生的情况。首先,在你的问题中,你有

_thread.start_new_thread(send(), ())
_thread.start_new_thread(recv(), ())

这并没有多大意义,因为执行
send()
,并立即进入无限循环
\u thread.start\u new\u thread()
要求第一个参数使用一个函数,因此如果将这些行改为:

_thread.start_new_thread(send, ())
_thread.start_new_thread(recv, ())
现在,让我们看看如果执行该代码会发生什么。首先,主线程在

c, a = s.accept()
直到客户端连接。然后主线程继续并启动线程2运行
send
函数,启动线程3运行
recv
函数。此时有3个线程正在运行:主线程、线程2和线程3。然后,主线程立即关闭插槽
c
s
。同时,线程2将继续执行该行

data = c.recv(4096).decode("UTF-8")
这是一个争用条件,即它是否会在主线程关闭
c
之前读取任何数据。它会猜测,在线程2读取主线程之前,主线程大部分时间都会关闭
c
,因此c.recv()返回一个空字节对象,从而导致调用
sys.exit(1)
,从而不正常地关闭整个程序


我不确定您想在这里做什么,但是该模块对于探索多线程python编程更有用。

\u thread.start\u new\u thread(send(),())
没有做您认为应该做的事情,特别是它无法启动新线程,因为
send()
进入无限循环。您可能想要的是
\u线程。启动新线程(send,())
。类似地,您可能需要
\u线程。启动新线程(recv,())
这是我首先做的,这就是我得到的错误:这就是为什么我选择这个选项。我可以自信地说,您所显示的是错误的。到底错在哪里?我提供了我使用的确切代码(唯一更改的是主机ip和端口,例如x.x.x.x:xxxx)以及您提供的正确错误输出。我向您展示的不是它应该的东西是什么?我要说的是
\u thread.start\u new\u thread(send(),())
绝对不正确。这并不意味着代码的其他部分都是正确的。