【问题标题】:Python3 socket doesn't work - graphitePython3 套接字不起作用 - 石墨
【发布时间】:2018-08-02 14:19:19
【问题描述】:

我创建了一个向石墨服务器发送数据的函数。它在执行时将指标名称、值和时间戳发送到石墨服务器:

def collect_metric(metricname, value, timestamp):
   sock = socket.socket()
   sock.connect( ("localhost", 2003) )
   sock.send("%s %s %s\n" % (metricname, value, timestamp))
   sock.close()

上面的这个函数在 Python2 中运行良好。我不得不为 Python3 重写这个函数。现在没有数据将发送到石墨。石墨/碳日志或其他内容中没有日志条目...:

def collect_metric(metricname, value, timestamp):
   sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
   sock.connect( ("localhost", 2003) )
   metricname = metricname.encode()
   if type(value) == "str":
      value = value.encode()
   timestamp = timestamp.encode()
   message = bytearray()
   message = bytes(metricname+b" "+value+b" "+timestamp)
   sock.sendall(message)
   print(message.decode())
   sock.close()

我没有收到任何错误。同样在终端上,我得到了正确的格式/输出(参见“print(message.decode())”)

有人知道为什么它不起作用吗? 谢谢。

【问题讨论】:

    标签: python-3.x sockets graphite


    【解决方案1】:

    字节数组没有任何编码。试试这个: message = (metricname+" "+value+" "+timestamp).encode("UTF-8")

    sock.send(messages)

    【讨论】:

    • 这对我有用,但我可以保存这个更改并用编码声明字节数组吗?
    • 当然。 bytearray(b"", "utf-8")
    • 对不起,但我必须更正我的答案:不幸的是它仍然不起作用。 (我在测试时也运行了旧脚本)。所以我像上面一样编辑,但没有帮助。你认为这是一个编码问题吗?
    • 我在尝试向服务器发送未编码的字节数组时总是出错。
    • 你删除了value = value.encode() + metricname 和时间戳吗?
    【解决方案2】:

    您发送的消息末尾似乎缺少“\n”

    message = bytes(metricname+b" "+value+b" "+timestamp)
    

    应该是:

    message = bytes(metricname+b" "+value+b" "+timestamp + '\n')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-06
      • 2019-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多