【问题标题】:Server socket in python doesn't print new linepython中的服务器套接字不打印新行
【发布时间】:2020-02-06 08:45:24
【问题描述】:

我正在尝试简单的客户端和单服务器,客户端发送 2 次按摩,服务器接收 2 次按摩。我正在打印第一个按摩打印(data1)和第二个按摩打印(data2),并以某种方式在同一行打印两个按摩。你能帮忙吗?

服务器

import socket

SERVER_IP = '0.0.0.0'
DEST_PORT = 1731

server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server_socket.bind((SERVER_IP,DEST_PORT))
server_socket.listen(1)
client_socket,address=server_socket.accept()


data1 = client_socket.recv(512).decode()
print(data1)
data2 = client_socket.recv(512).decode()
print(data2)

client_socket.close()
server_socket.close()

客户代码

#client
import socket

HOST_IP = '127.0.0.1'
DEST_PORT = 1731

my_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

my_socket.connect((HOST_IP,DEST_PORT))

data1 = "test1"
print("client send")
my_socket.sendall(data1.encode())
my_socket.sendall("second send ".encode())

my_socket.close()

【问题讨论】:

    标签: python python-3.x sockets


    【解决方案1】:

    TCP 套接字是一种面向流的协议,而不是面向消息的协议。

    发生的情况是您的客户端在您的服务器从套接字读取任何内容之前最终发送了b"test1second send "

    当它读取时,它会读取多达 512 个字符 - 足以包含您的消息 - 并且再次读取多达 512 个字符,但此时要读取的字符为零,并且会打印一个空行。

    根据您的实际需求,您需要找到一种方法来分隔或封装您的消息;对于文本,一种流行的选择是换行符(尽管如果您需要在消息中传输实际的换行符,它会让您陷入困境)。

    更好的选择仍然是netstrings,其中每条消息的前面都有它的长度(对于网络字符串,ASCII 格式,但它可以是二进制无符号整数(4 字节),或者你指定的任何值),或者某种TLV 的方案。

    【讨论】:

    • 只是想添加到这个 - data.decode('utf-8').split('\r\n\r\n', 1)[1]) 应该做的伎俩?
    • @Joel 只要您的 read 调用恰好读取了所有数据!也不能保证您在单个 .read() 调用中阅读了整个分隔/封装的消息。
    • 当然,但是,在这种情况下,要解决他的 POC,不应该是答案吗?它不适合现实世界的应用程序,但是对于这个小程序,我认为他会很好。
    • 也许——直到他突然没有了。 :)
    • 我知道它并不适合所有情况,但在这种情况下,我认为它对他来说效果很好。但是,您的回答是对的,但我仍然认为提供一个实际的(即使是有缺陷的)解决方案(也许将我的建议添加到答案中)比不提供解决方案要好:)
    猜你喜欢
    • 2012-07-16
    • 2011-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多