【问题标题】:Python TCP sockets headersPython TCP 套接字标头
【发布时间】:2018-07-09 10:15:00
【问题描述】:

我需要使用 TCP 在客户端和服务器之间创建通信。但我想发送和使用“标题”。因此,我想从客户端发送一个标头“COMMAND1”,然后服务器返回给我一些东西。

我有以下代码:

服务器

import socket
import threading

bind_ip = '0.0.0.0'
bind_port = 9998

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind((bind_ip, bind_port))
server.listen(5)  # max backlog of connections

print ('Listening on {}:{}'.format(bind_ip, bind_port))


def handle_client_connection(client_socket):
    request = client_socket.recv(1024)
    print ('Received {}'.format(request))
    client_socket.send('Response1!'.encode('utf-8'))
    client_socket.close()

while True:
    client_sock, address = server.accept()
    print ('Accepted connection from {}:{}'.format(address[0], address[1]))
    client_handler = threading.Thread(
        target=handle_client_connection,
        args=(client_sock,)  # without comma you'd get a... TypeError: handle_client_connection() argument after * must be a sequence, not _socketobject
    )
    client_handler.start()

客户

import socket

hostname, sld, tld, port = 'www', 'integralist', 'co.uk', 80
target = '{}.{}.{}'.format(hostname, sld, tld)

# create an ipv4 (AF_INET) socket object using the tcp protocol (SOCK_STREAM)
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# connect the client
# client.connect((target, port))
client.connect(('0.0.0.0', 9998))

# send some data (in this case a HTTP GET request)
client.send('hi'.encode('utf-8'))

# receive the response data (4096 is recommended buffer size)
response = client.recv(4096)

print (response)

任何人都知道返回“Response1!”的最佳方式。当标头是“COMMAND1”和“Response2!”时当标题是“COMMAND2”时?

我找不到有关如何使用标题的示例

编辑:它不必是“COMMAND1”或“COMMAND2”,它可以是“0”或“1”,或其他任何内容。

【问题讨论】:

  • TCP 中没有标头之类的东西。您可能希望将每个recv() 的返回附加到缓冲区中并解析缓冲区以查找您期望的任何数据,以便检测已发送的命令。
  • @quamrana 你确定吗?看看这个:telescript.denayer.wenk.be/~hcr/cn/idoceo/images/tcp_header.gif
  • @VladislavZhdanov:TCP 有一个固定的标头,仅用于 TCP 本身所需的目的。您不能向其中添加自定义标题。您的“标头”是应用程序逻辑,因此属于有效负载。
  • 从程序员的角度来看,TCP 中没有标头之类的东西。 TCP 是一种流协议,程序员看不到实际的标头。
  • 读取前 n 个字节?例如 8 代表 'COMMAND1',1 代表 '0'

标签: python sockets tcp tcpclient


【解决方案1】:

如果您想添加自己的标题,您只需:

  1. 确保您的程序找到消息的开头(例如,每条消息都以“!?&”开头)

  2. 在消息的开始符号之后发送您自己的标头数据。

  3. 也许用一些东西标记你的消息的结尾或者在你的标题中传递一个长度。

  4. 由于 TCP 会给你一个数据流,它可能会遇到这样的情况,它一次只给你 2 或 3 条消息。您必须自己分隔这些消息(例如,使用“?!&”作为每条消息的开头)。

您始终可以创建自己的协议作为另一个协议的有效负载。正如从以太网的角度来看,TCP 只是有效载荷。

【讨论】:

  • 您能否发布最短的服务器端和客户端程序,以完成您的建议?听起来它可以正常工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-22
  • 1970-01-01
  • 1970-01-01
  • 2021-09-10
  • 1970-01-01
  • 2017-11-01
  • 2021-10-21
相关资源
最近更新 更多