2016-06-12 4 views
3

Эй, ребята, я думаю, что нужно еще раз ваша помощь :(Python - сокеты, несколько сообщений

Я застрял на этом сокетов, я посмотрел везде, но я не нашел ответа еще

.

ПРОБЛЕМА:. Я могу только отправить 1 сообщение от клиента перед ним либо дает мне ошибку или заканчивает сценарий мне нужно, чтобы иметь возможность отправить несколько сообщений на сервер

стороне сервера (показано на рисунке. ниже) должны быть точными:

# Echo server program 
import socket 
import time 
import os 

#----------------------------------------------------------------------------------------------------------------------- 

today = time.strftime('%Y.%m.%d') 
logFileName = "log - " + today + ".txt" 


HOST = '10.0.0.16'               
PORT = 8080                 # Reserve a port for your service 
BUFFER_SIZE = 1024               
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)      # Create a socket object 
s.bind((HOST, PORT))              # Bind to the port 


def print_write(text): 
    log.write(time.strftime("%H:%M:%S") + " | " + text) 
    log.write("\n") 
    print text 


#----------------------------------------------------------------------------------------------------------------------- 


if os.path.isfile(logFileName) is True: 
    log = open(logFileName, 'a+') 
    print_write("[SERVER] Log for " + today + " already exists.") 
    print_write("[SERVER] Starting comms") 
else: 
    print "[SERVER] Log doesn't exist" 
    log = open(logFileName, 'a+')           # Create file -> log - %date%.txt 
    print_write("[SERVER] Log created") 


while True: 
    s.listen(1) 
    conn, addr = s.accept() 
    data = conn.recv(BUFFER_SIZE) 
    if data == "Comms Shutdown": 
     print_write("------ REMOTE SHUTDOWN ------") 
     conn.close() 
     raise SystemExit 
    else: 
     print_write("[COMMS] " + str(addr) + " says: " + data) 

log.close() 

Извините, если это очень грязно и запутанно, но у меня нет много времени, чтобы закончить этот проект, если у вас есть какие-либо вопросы, просто спросите.

Для стороне клиента я не так много, но здесь, я дам вам это:

import socket 

HOST = '10.0.0.16'   # The remote host 
PORT = 8080     # The same port as used by the server 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.connect((HOST, PORT)) 

while True: 
    msg = raw_input() 
    s.sendall(msg) 
    print msg 

Я знаю, что это не работает, это просто чтобы дать вам представление о том, что мне нужно ,

Заранее спасибо.

+0

Код сервера только вызывает recv один раз перед повторным циклом, вы должны использовать цикл while или что-то подобное, чтобы вызвать 'recv' несколько раз, прежде чем открывать новое соединение. – noteness

ответ

3

Проблема заключается в том, что вы только читаете первое сообщение от каждого открытого соединения, прежде чем переходить к следующему. Методы accept() ждут нового соединения и предоставят вам информацию, необходимую для ввода нового. Метод recv(), с другой стороны, получает данные из существующего соединения и ждет, если их нет. Если вы хотите получать несколько сообщений от одного клиента, вы можете просто ждать первого подключения, а затем ждать данных с recv(). Это может выглядеть следующим образом:

s.listen(1) 
conn, addr = s.accept() 
while True: 
    data = conn.recv(BUFFER_SIZE) 
    if data == "Comms Shutdown": 
     print_write("------ REMOTE SHUTDOWN ------") 
     conn.close() 
     raise SystemExit 
    else: 
     print_write("[COMMS] " + str(addr) + " says: " + data) 

Если вы хотите, чтобы иметь возможность также управлять несколькими клиентами, вы должны будете создать поток для каждого из петли в ожидании новых подключений. Это немного сложнее:

def client_handler(conn): 
    while True: 
     data = conn.recv(BUFFER_SIZE) 
     if data == "Comms Shutdown": 
      print_write("------ REMOTE SHUTDOWN ------") 
      conn.close() 
      raise SystemExit 
      # this will kill the server (remove the line above if you don't want that) 
     else: 
      print_write("[COMMS] " + str(addr) + " says: " + data) 

while True: 
    s.listen(1) 
    conn, addr = s.accept() 
    recv_thread = threading.Thread(target=client_handler, args=(conn,)) 
    recv_thread.start() 

Весь этот код не проверен. Имейте в виду, что я пропустил часть регистрации и часть создания сокета, а также весь импорт.

+0

Именно то, что я искал! Отлично! Большое спасибо. – Pinco