【问题标题】:Python 3.X Unix Socket Example [duplicate]Python 3.X Unix 套接字示例 [重复]
【发布时间】:2014-04-25 01:21:14
【问题描述】:

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

我不断收到 TypeErrors。

我一直在使用的示例是:

client.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 部分。有什么建议吗?
  • 此外,我使用的示例中的语法从一个导入中加载了多个模块 导入操作系统,os.path 这是仅从 os 模块加载 os.path 的旧方法吗?

server.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 是否只支持二进制?

  • 最简单的方法是什么?

提前致谢!

【问题讨论】:

  • 在来自 www.velvetcache.org 的 John Hobbs 的帮助下,我能够在 Python 3.4 中完成上述工作。感谢约翰的帮助! gist.github.com/jmhobbs/11276249

标签: python-3.4


【解决方案1】:

明确回答 OP 的问题:

  1. “TypeError: 'str' does not support the buffer interface”错误是由于尝试通过字节接口发送/接收字符串编码数据而引起的。

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 完全一样
    • 实际上更糟糕的是,明确地改写该行将是if os.path.exists("/tmp/python_unix_sockets_example") is True:,而==用于将变量与值匹配。如if x == "some text string": print(x)
    猜你喜欢
    • 2015-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-12
    • 2012-03-04
    • 1970-01-01
    • 2016-07-30
    相关资源
    最近更新 更多