Python 3.X Unix Socket示例

时间:2014-04-25 01:21:14

标签: python-3.4

我在过去几个小时里一直在寻找一个简单的服务器/客户端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部分。任何建议?
  • 此外,我使用的示例中的语法从一个导入加载了多个模块 import os,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'不支持缓冲区接口。

  • Python 3.4 Unix套接字是否仅支持二进制文件?

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

提前致谢!

2 个答案:

答案 0 :(得分:1)

明确回答OP的问题:

  1. " TypeError:' str'不支持缓冲接口"尝试通过字节接口发送/接收字符串编码数据导致错误。

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

  3. 使其工作的最简单方法是@jmhobbs在他上面链接的要点中演示:当client.send()'以及.decode时,你必须将.ccode()你的字符串转换为字节。 ()当server.recv()&#39>时,字节返回字符串。

答案 1 :(得分:-2)

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