4

过去几个小时,我一直在寻找一个简单的服务器/客户端 Unix 套接字示例。我找到了适用于 Python 2.X 的示例,但找不到适用于 Python 3.X 的示例。

我不断收到 TypeErrors。

我一直在使用的示例是:

客户端.py

# -*- coding: utf-8 -*-
import socket
import os
# import os, os.path

print("Connecting...")
if os.path.exists("/tmp/python_unix_sockets_example"):
    client = socket.socket( socket.AF_UNIX, socket.SOCK_DGRAM )
    client.connect("/tmp/python_unix_sockets_example")
    print("Ready.")
    print("Ctrl-C to quit.")
    print("Sending 'DONE' shuts down the server and quits.")
    while True:
#        try:
            x = input( "> " )
            if "" != x:
            print("SEND:", x)
                client.send( x )
                if "DONE" == x:
                    print("Shutting down.")
                break
#        except KeyboardInterrupt, k:
#            print("Shutting down.")
    client.close()
else:
    print("Couldn't Connect!")
    print("Done")
  • 对于客户端部分,我不确定如何让 KeyboardInterupt 在 3.X 中工作,所以我取消了 Try 和 except 部分。有什么建议吗?
  • 此外,我使用的示例中的语法从一个 import import os, os.path 加载了多个模块,这是仅从 os 模块加载 os.path 的旧方法吗?

服务器.py

# -*- coding: utf-8 -*-

import socket
import os
# import os, os.path
# import time

if os.path.exists("/tmp/python_unix_sockets_example"):
    os.remove("/tmp/python_unix_sockets_example")

print("Opening socket...")
server = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
server.bind("/tmp/python_unix_sockets_example")

print("Listening...")
while True:
    datagram = server.recv(1024)

    if not datagram:
        break
    else:
        print("-" * 20)
        print(datagram)
        if "DONE" == datagram:
            break
print("-" * 20)
print("Shutting down...")
server.close()
os.remove("/tmp/python_unix_sockets_example")
print("Done")
  • 当我运行它时,我得到 TypeError: 'str' does not support the buffer interface。

  • Python 3.4 Unix Sockets 是否只支持二进制?

  • 使这项工作最简单的方法是什么?

提前致谢!

4

2 回答 2

2

要明确回答 OP 的问题:

  1. “TypeError:'str' 不支持缓冲区接口”错误是由尝试通过字节接口发送/接收字符串编码数据引起的。

  2. Unix套接字不知道编码,它们传递原始字节,Python 3+不再为你做任何魔术字节<->编码字符串转换,所以在这个意义上是的,(Python 3(.4))Unix套接字只支持“二进制”。

  3. 使其工作的最简单方法是@jmhobbs 在他上面链接的要点中演示:您必须在 client.send()'ing 时将字符串 .encode() 转换为字节,并在服务器时将字节 .decode() 返回字符串.recv()'ing 他们。

于 2015-07-03T08:06:00.563 回答
-3

您可能需要做的一件事是将 if os.path.exists("/tmp/python_unix_sockets_example"): 替换为 if os.path.exists("/tmp/python_unix_sockets_example") == True:

于 2014-09-10T00:09:25.933 回答