[英]Python 3 Sockets - Receiving more then 1 character
因此,當我打開CMD並使用以下命令創建telnet連接時:
telnet本地主機5555
如下面的屏幕所示,它將出現“歡迎”字樣。 之后,我鍵入CMD的每個字符都會立即打印/發送。 我的問題是:是的,如果是的話,如何鍵入消息然后發送給我,所以我以1句話而不是逐字符地接收它們。
import socket
import sys
from _thread import *
host = ""
port = 5555
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
try:
s.bind((host,port))
except socket.error as e:
print(str(e))
s.listen(5) #Enable a server to accept connections.
print("Waiting for a connection...")
def threaded_client(conn):
conn.send(str.encode("Welcome\n"))
while True:
# for m in range (0,20): #Disconnects after x chars
data = conn.recv(2048) #Receive data from the socket.
reply = "Server output: "+ data.decode("utf-8")
print(data)
if not data:
break
conn.sendall(str.encode(reply))
conn.close()
while True:
conn, addr = s.accept()
print("connected to: "+addr[0]+":"+str(addr[1]))
start_new_thread(threaded_client,(conn,))
您需要繼續閱讀直到流結束:
string = ""
while True:
# for m in range (0,20): #Disconnects after x chars
data = conn.recv(1) #Receive data from the socket.
if not data:
reply = "Server output: "+ string
conn.sendall(str.encode(reply))
break
else:
string += data.decode("utf-8")
conn.close()
順便說一句,使用該方法,您一次將讀取一個字符。 您可以使其適應服務器發送數據的方式。
這取決於您要在字符模式還是行模式下運行。 目前,您的代碼很好,但是Windows telnet客戶端以字符模式運行。 您可以使用膩子在行模式下進行嘗試,或者如果您確實需要在char模式下運行,則繼續讀取緩沖區,直到發送換行符為止。
這是我運行您的代碼時服務器所說的:
Waiting for a connection...
connected to: 127.0.0.1:46738
b'Hello\r\n'
telnet會話beeing:
telnet 127.0.0.1 5555
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
Welcome
Hello
Server output: Hello
您可以嘗試執行以下操作:(偽代碼)
temp = conn.recv(2048)
data.concatenate(temp) # maybe data = data + temp ???? little rusty
if data[-1] == '\n':
print 'message: ' + data
etc...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.