簡體   English   中英

Python 3套接字-接收多於1個字符

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM