你似乎有一个好的开始,还有一些很好的建议。
您可能想要创建一个微型命令解释器,一个命令用于文件长度,另一个命令用于您需要能够执行的每项其他操作。一个大的 if/elif/elif/.../else 在你的主 socket.recv() 之后应该这样做。
然而,当你编写一个套接字程序时,如果你假设你的 socket.send() 和你的 socket.recv() 之间是一对一的关系,你就有可能出现细微的错误。TCP 套接字保留将多个 socket.send() 聚合为一个数据包,或将一个数据包拆分为多个 recv 的权利,以及它可以考虑的任何其他大小更改以提高性能或可靠性。
出于这个原因,我喜欢使用我的 bufsock.py 模块,使长度重新排列成为一个问题,同时简单地检索数据:http:
//stromberg.dnsalias.org/~dstromberg/bufsock.html
顺便说一句,根据您需要的信息类型,只使用 sshfs 或 CIFS 或 NFS 文件系统并像访问本地一样访问它可能会更容易。
无论如何,如果您想要或需要使用套接字,这里有一个 Python 3 中的示例。它基于 SJP 的帖子:
#!/usr/bin/python3
import os
import sys
import time
import socket as socket_mod
sys.path.insert(0, '/usr/local/lib')
import bufsock as bufsock_mod
if sys.argv[1:] and sys.argv[1] == 'server':
# Echo server program
HOST = 'localhost' # Symbolic name meaning the local host
PORT = 50007 # Arbitrary non-privileged port
socket = socket_mod.socket(socket_mod.AF_INET, socket_mod.SOCK_STREAM)
socket.bind((HOST, PORT))
socket.listen(1)
connection, address = socket.accept()
print('Connected to from {}'.format(address))
bufsock = bufsock_mod.bufsock(connection)
while True:
print('Reading command')
sys.stdout.flush()
command = bufsock.readto(b'\0')[:-1]
print('Got {} command'.format(command))
sys.stdout.flush()
if command == b'stat':
filename = bufsock.readto(b'\0')[:-1]
length = os.stat(filename).st_size
length_bytes = bytes(str(length), 'ISO-8859-1')
bufsock.send(length_bytes + b'\0')
bufsock.flush()
elif command == b'date':
bufsock.send(bytes(time.ctime(), 'ISO-8859-1') + b'\0')
bufsock.flush()
elif command == b'exit':
sys.stderr.write('{}: terminating on exit command\n'.format(sys.argv[0], ))
bufsock.close()
sys.exit(0)
else:
sys.stderr.write('{}: Illegal command received: {}\n'.format(sys.argv[0], command))
bufsock.close()
sys.exit(1)
elif sys.argv[1:] and sys.argv[1] == 'client':
# Echo client program
HOST = 'localhost' # The remote host
PORT = 50007 # The same port as used by the server
socket = socket_mod.socket(socket_mod.AF_INET, socket_mod.SOCK_STREAM)
socket.connect((HOST, PORT))
bufsock = bufsock_mod.bufsock(socket)
# Get the length of /etc/services
bufsock.send(b'stat\0/etc/services\0')
bufsock.flush()
length = bufsock.readto(b'\0')
print('length of /etc/services is {}'.format(length))
bufsock.send(b'date\0')
bufsock.flush()
date = bufsock.readto(b'\0')
print('date is {}'.format(date))
bufsock.send(b'exit\0')
bufsock.close()
else:
sys.stderr.write('{}: Must call with "server" or "client" argument\n'.format(sys.argv[0]))
sys.exit(1)
HTH :)