繁体   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