我在过去几个小时里一直在寻找一个简单的服务器/客户端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")
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套接字是否仅支持二进制文件?
使这项工作最简单的方法是什么?
提前致谢!
答案 0 :(得分:1)
明确回答OP的问题:
" TypeError:' str'不支持缓冲接口"尝试通过字节接口发送/接收字符串编码数据导致错误。
Unix套接字不知道编码,它们传递原始字节,Python 3+不再为你做任何魔术字节< - >编码的字符串转换,所以从这个意义上来说,是(Python 3(。 4))Unix套接字仅支持"二进制"。
使其工作的最简单方法是@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: