Я пытаюсь написать make-файл, который будет копировать написанную мной клиент-серверную программу (на самом деле это всего лишь два сценария Python, но это не настоящий вопрос) ...
test:
python server.py 7040 &
python subscriber.py localhost 7040 &
python client.py localhost 7040;
Итак, я запускаю make test
и получаю возможность ввести сообщение от client.py
:
python server.py 7040 &
python subscriber.py localhost 7040 &
python client.py localhost 7040;
Enter a message:
Когда client
вводит пустое сообщение, он закрываетсясоединение и завершается успешно.Теперь, как я могу автоматизировать закрытие subscriber
(который является просто «слушателем») чата, что, в свою очередь, завершит процесс server
.
Я пытался получить идентификаторы процессаиз этих вызовов, используя pidof
- но я не был уверен, что это был правильный маршрут. Я не эксперт по make-файлам, может быть, я мог бы просто написать быстрый скрипт Python, который запускается из моего make-файла, чтобы выполнить работу за меня?предложения были бы хорошими.
РЕДАКТИРОВАТЬ :
Я написал сценарий сценария Python и получил следующее:
import server
import client
import subscriber
#import subprocess
server.main(8092)
# child = subprocess.Popen("server.py",shell=False)
subscriber.main('localhost',8090)
client.main('localhost', 8090)
Однако теперь я получаю ошибки, что мои глобальные переменные не определены (я думаю, что это напрямую связано с добавлением main
методов к моим server
(и subscriber
и client
, но я нееще далеко. :) Это может заслуживать отдельного вопроса ...
Вот мой код сервера:
import socket
import select
import sys
import thread
import time
# initialize list to track all open_sockets/connected clients
open_sockets = []
# thread for each client that connects
def handle_client(this_client,sleeptime):
global message,client_count,message_lock,client_count_lock
while 1:
user_input = this_client.recv(100)
if user_input == '':
break
message_lock.acquire()
time.sleep(sleeptime)
message += user_input
message_lock.release()
message = message + '\n'
this_client.sendall(message)
# remove 'this_client' from open_sockets list
open_sockets.remove(this_client)
this_client.close()
client_count_lock.acquire()
client_count -= 1
client_count_lock.release()
def main(a):
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
port = a
server.bind(('', port))
server.listen(5)
message = ''
message_lock = thread.allocate_lock()
client_count = 2
client_count_lock = thread.allocate_lock()
for i in range(client_count):
(client,address) = server.accept()
open_sockets.append(client)
thread.start_new_thread(handle_client,(client,2))
server.close()
while client_count > 0:
pass
print '************\nMessage log from all clients:\n%s\n************' % message
if __name__ == "__main__":
if sys.argv[1]:
main(int(sys.argv[1]))
else:
main(8070)