Чтобы сервер также запускал клиента, вы можете вставить эту строку непосредственно перед вызовом RunServer()
в части кода __main__
:
threading.Thread(target=RunClient,args=('127.0.0.1',)).start()
Это запустит поток, который запускает RunClient('127.0.0.1')
параллельно с циклом событий сервера.
Однако есть несколько других проблем с кодом, которые вам также необходимо исправить, прежде чем это будет работать правильно. В частности:
В верхней части RunServer()
вы устанавливаете host
в качестве IP-адреса одной из сетевых карт на сервере. Это означает, что сервер может принимать входящие TCP-соединения только через один сетевой интерфейс, что означает, что (если этот сетевой интерфейс не является внутренним / зацикленным интерфейсом), сервер не будет принимать соединение с 127.0.0.1
от своего собственный клиент-поток. Это легко исправить, просто взамен установив host
в пустую строку, чтобы сервер принимал входящие TCP-соединения на всех локальных сетевых интерфейсах, и проблема исчезла.
def RunServer():
host = '' # was: socket.gethostbyname(socket.gethostname())
[...]
Вторая проблема заключается в том, что цикл обработки событий вашего сервера находится в состоянии ожидания занятости, в результате чего процесс сервера излишне использует 100% ядра ЦП в течение всего времени его работы. Это ужасно неэффективно. Причина этой проблемы здесь, внутри RunServer()
:
while True:
while not recvPackets.empty():
data,addr = recvPackets.get()
[...]
Обратите внимание, что в классе Python Queue
вызов get()
блокируется до тех пор, пока не будет получено больше данных, не позволяя процессору вращаться. Но в приведенном выше коде get()
никогда не вызывается, если только / 10 * * не является пустым, поэтому поток никогда не блокируется.
Исправить несложно, просто полностью удалите строку while not recvPackets.empty()
, чтобы get()
вызывался, даже когда очередь пуста. get()
не вернется, пока не будет данных для возврата.
while True:
data,addr = recvPackets.get()
[...]