【问题标题】:socket connection receive bytes python套接字连接接收字节python
【发布时间】:2016-01-27 12:20:01
【问题描述】:

我正在尝试通过 Python 中的套接字发送数据流。到目前为止,我设法创建了一个 dummy_data_gen.py,它将包含 4 个浮点数的行发送到 server.py。但是,我仍然在所有设置的稳定性方面遇到问题。

server.py:

import sys
import time
import socket
import numpy as np

# Create a TCP/IP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# Bind the socket to the port
server_address = ('localhost', 5002)
print >>sys.stderr, 'starting up on %s port %s' % server_address
sock.bind(server_address)

# Listen for incoming connections
sock.listen(1)

# Create a list to store the incoming data
data = []

while True:

    # Wait for a connection
    print >>sys.stderr, 'waiting for a connection'
    connection, client_address = sock.accept()

    try:
        print >>sys.stderr, 'connection from', client_address

        while True:

            incoming_data = connection.recv(48).split(',')
            print incoming_data

            event = float(incoming_data[0]), float(incoming_data[1]), float(incoming_data[2]), float(incoming_data[3])

            data += [event]

            time.sleep(0.01)

    finally:
        # Clean up the connection
        connection.close()

dummy_data_gen.py

import sys
import time
import socket

# Create a TCP/IP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# Connect the socket to the port where the server is listening
server_address = ('localhost', 5002)
sock.connect(server_address)

file = '../data/myfile.txt'

# Simulating a real-time data stream at 100 Hz
try:
    with open(file) as f:
        for line in f:
            sock.sendall(line)
            time.sleep(0.01)

finally:
    print >>sys.stderr, 'closing socket'
    sock.close()

我的问题是有时通信工作正常,但是,我遇到的情况是每行接收到的数据多于应有的数据。在以下输出示例中,前 7 行是正确的,但以下行不正确,因此存在问题:

['391910745379', '24.134277', '-1.9487305', '-117.373535', '\n']
['391920745379', '24.434082', '-1.3491211', '-117.373535', '\n']
['391930745379', '23.68457', '-0.5996094', '-116.62402', '\n']
['391940745379', '24.434082', '-1.0493164', '-115.57471', '\n']
['391950745379', '24.134277', '-1.0493164', '-116.47412', '\n']
['391960745379', '23.234863', '-1.0493164', '-116.47412', '\n']
['391970745379', '24.583984', '-0.89941406', '-116.92383', '\n']
['391980745379', '23.384766', '-0.2998047', '-116.62402', '\n39']
['1990745379', '23.68457', '-0.5996094', '-115.72461', '\n39200']
['0745379', '23.834473', '-0.44970703', '-115.87451', '\n392010']
['745379', '23.534668', '-1.0493164', '-114.9751', '\n392020745']
['379', '23.384766', '-1.7988281', '-115.72461', '\n39203074537']
['9', '22.935059', '-0.44970703', '-114.9751', '\n392040745379', '']

我尝试使用 connection.recv 字节,但我仍然面临这个问题。

EDIT1:根据一些建议,我将 server.py 修改如下:

del_message = '\n'
del_stream = ','

while True:
        _buffer += connection.recv(1)
        if del_message in _buffer:
            incoming_data = _buffer.split(del_stream)
            event = float(incoming_data[0]), \
                        float(incoming_data[1]), \
                            float(incoming_data[2]), \
                                float(incoming_data[3])

这种方法似乎解决了我的问题,但是性能非常慢。我的文件包含大约 6300 行,实际上是在 70 秒内发送的(在我的虚拟数据生成器上关闭套接字的时间间隔)。但是,我花了将近 10 分钟才收到所有 6300 行。似乎我在开始时每秒收到更多样本,而不是在流结束时。

【问题讨论】:

  • 你能指出 /problematic 行的错误之处吗?
  • @inbinder 问题是正在发送的数据流由 4 个元素组成。例如,您可以在最后一行看到我们有 5 个元素。此外,在第 9 行,未来数据流发送中的某些元素似乎出现在列表的最后一项中
  • @dudas 正在发送的数据流由元素流组成。

标签: python sockets tcp buffer


【解决方案1】:

如果您有一个使用换行符终止消息的消息协议,您需要编写一些代码来实现该协议。它不会靠魔法起作用。

您需要一个“接收消息”功能,其中“消息”定义为“由换行符分隔的字节序列”。您从未编写过任何此类函数,因此您接收的不是消息,而是您发送的字节块。

【讨论】:

  • “实施该协议”是什么意思。去掉“\n”?
  • 没有。他需要一个“接收消息”功能,其中“消息”定义为“由换行符分隔的字节序列”。他从来没有写过任何这样的函数。然而他期待收到消息。
  • @DavidSchwartz 感谢您的帮助。但是,我认为我并没有完全理解在换行符之后我有一些信息的情况下这会如何提供帮助。另外,能否举个例子说明如何建立协议?
  • @dudas 没有“换行后的信息”。根据定义,消息以换行符结尾。您会在换行符之后看到信息,因为您从未编写过函数来接收消息。写一个。你打电话给connection.recv 期望它理解你所说的“消息”是什么意思。它怎么会知道?
  • @DavidSchwatrz 对不起,我不想作为一个懒惰的人通过,但老实说,我仍然对我应该写什么函数感到困惑。你能详细说明一下吗?
猜你喜欢
  • 2011-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-25
  • 1970-01-01
  • 2013-04-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多