[英]Python - Socket Communication, multiple messages
我被困在這個套接字通信上,我到處找,但我還沒有找到答案。
問題:在客戶端給我一個錯誤或結束腳本之前,我只能從客戶端發送 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()
所有這些代碼都未經測試。 請注意,我省略了日志記錄部分和套接字創建部分以及所有導入。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.