【发布时间】: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