的Python - socket通信,多个消息

问题描述:

嗨我想我需要再次你的帮助:(的Python - socket通信,多个消息

我卡在这个socket通信,我到处找,但我还没有找到答案尚未

该问题:我只可以从客户端发送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

问题是,您只能从每个打开的连接中读取第一条消息,然后才能转到下一个连接。 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) 

如果你希望能够还管理多个客户,你将不得不为每个一个从while循环等待新的连接线程。这有点复杂:

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