使用 Python 从 Unix 套接字连接读取和写入
Read and write from Unix socket connection with Python
我正在使用 Python 试验 Unix 套接字。我想创建一个创建并绑定到套接字、等待命令并发送响应的服务器。
客户端将连接到套接字,发送一个命令,打印响应并关闭连接。
这就是我在服务器端做的事情:
# -*- coding: utf-8 -*-
import socket
import os, os.path
import time
from collections import deque
if os.path.exists("/tmp/socket_test.s"):
os.remove("/tmp/socket_test.s")
server = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
server.bind("/tmp/socket_test.s")
while True:
server.listen(1)
conn, addr = server.accept()
datagram = conn.recv(1024)
if datagram:
tokens = datagram.strip().split()
if tokens[0].lower() == "post":
flist.append(tokens[1])
conn.send(len(tokens) + "")
else if tokens[0].lower() == "get":
conn.send(tokens.popleft())
else:
conn.send("-1")
conn.close()
但我在尝试聆听时得到 socket.error: [Errno 95] Operation not supported
。
unix sockets支持监听吗?否则,怎样才是读写兼顾的正确方式呢?
感谢任何帮助:)
SOCK_DGRAM
套接字不监听,它们只是绑定。将套接字类型更改为 SOCK_STREAM
,您的 listen()
将起作用。
查看 PyMOTW Unix Domain Sockets (SOCK_STREAM
) vs. PyMOTW User Datagram Client and Server (SOCK_DGRAM
)
#!/usr/bin/python
import socket
import os, os.path
import time
from collections import deque
if os.path.exists("/tmp/socket_test.s"):
os.remove("/tmp/socket_test.s")
server = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
server.bind("/tmp/socket_test.s")
while True:
server.listen(1)
conn, addr = server.accept()
datagram = conn.recv(1024)
if datagram:
tokens = datagram.strip().split()
if tokens[0].lower() == "post":
flist.append(tokens[1])
conn.send(len(tokens) + "")
elif tokens[0].lower() == "get":
conn.send(tokens.popleft())
else:
conn.send("-1")
conn.close()
已修复您的其他问题...并且 SOCK_DGRAM...
我正在使用 Python 试验 Unix 套接字。我想创建一个创建并绑定到套接字、等待命令并发送响应的服务器。
客户端将连接到套接字,发送一个命令,打印响应并关闭连接。
这就是我在服务器端做的事情:
# -*- coding: utf-8 -*-
import socket
import os, os.path
import time
from collections import deque
if os.path.exists("/tmp/socket_test.s"):
os.remove("/tmp/socket_test.s")
server = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
server.bind("/tmp/socket_test.s")
while True:
server.listen(1)
conn, addr = server.accept()
datagram = conn.recv(1024)
if datagram:
tokens = datagram.strip().split()
if tokens[0].lower() == "post":
flist.append(tokens[1])
conn.send(len(tokens) + "")
else if tokens[0].lower() == "get":
conn.send(tokens.popleft())
else:
conn.send("-1")
conn.close()
但我在尝试聆听时得到 socket.error: [Errno 95] Operation not supported
。
unix sockets支持监听吗?否则,怎样才是读写兼顾的正确方式呢?
感谢任何帮助:)
SOCK_DGRAM
套接字不监听,它们只是绑定。将套接字类型更改为 SOCK_STREAM
,您的 listen()
将起作用。
查看 PyMOTW Unix Domain Sockets (SOCK_STREAM
) vs. PyMOTW User Datagram Client and Server (SOCK_DGRAM
)
#!/usr/bin/python
import socket
import os, os.path
import time
from collections import deque
if os.path.exists("/tmp/socket_test.s"):
os.remove("/tmp/socket_test.s")
server = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
server.bind("/tmp/socket_test.s")
while True:
server.listen(1)
conn, addr = server.accept()
datagram = conn.recv(1024)
if datagram:
tokens = datagram.strip().split()
if tokens[0].lower() == "post":
flist.append(tokens[1])
conn.send(len(tokens) + "")
elif tokens[0].lower() == "get":
conn.send(tokens.popleft())
else:
conn.send("-1")
conn.close()
已修复您的其他问题...并且 SOCK_DGRAM...