2016-06-12 4 views
3

얘들 아 난 내가파이썬 - 소켓 통신, 여러 메시지

나는이 소켓 통신에 붙어있어, 내가 찾아 봤는데하지만 난 아직 답을 못 찾았 다시 당신의 도움이 :(필요가 있다고 생각

.

인한 문제 :. 나는 단지 그것을하기 전에 클라이언트에서 한 메시지를 전송하거나 스크립트를 나에게 오류를 제공하거나 종료 할 수 나는 서버에 여러 메시지를 보낼 수 있어야합니다

표시되는 서버 측 (. 아래 참조) : 괜찮습니다.

# 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를 호출하기 전에 recv를 반복하기 전에 새로운 연결을 열기 전에'recv'를 여러 번 호출하는 while 루프 또는 이와 유사한 것을 사용해야합니다. – 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