的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
我知道这是行不通的,它只是给你什么,我需要一个想法。
预先感谢您。
答
问题是,您只能从每个打开的连接中读取第一条消息,然后才能转到下一个连接。 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
您的服务器代码在再次循环前只调用recv一次,您应该使用while循环或类似的东西在打开新连接前多次调用'recv' .. – noteness