使用python检索位于不同应用服务器上的文件信息

2024-04-24 19:06:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我是python新手,我正在尝试编写一个python脚本,它可以检索位于不同应用服务器上的文件的信息(大小等)。 我不知道我可以用哪个软件包连接到另一个应用服务器。在

有这样的包裹我可以用吗?在

我尝试过使用套接字连接,但这不起作用,我不确定这是否正确。在

import socket

HOST = ('10.211.36.85','8083')
print type(HOST)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#s.bind('HOST')
socket.create_connection('10.211.36.85:8083'

s.listen(1)
conn, addr = s.accept()
print 'Connected by', addr
while 1:
    data = conn.recv(1024)
    if not data: break
       conn.sendall(data)
conn.close()

如果有其他更简单的方法,请告知。 提前感谢您的帮助和时间。在


Tags: 文件import脚本信息hostdatatypesocket
2条回答
# Echo server program
import socket

HOST = ''                 # Symbolic name meaning the local host
PORT = 50007              # Arbitrary non-privileged port
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)
conn, addr = s.accept()
print 'Connected by', addr
while 1:
    data = conn.recv(1024)
    if not data: break
    conn.send(data)
conn.close()

# Echo client program
import socket

HOST = 'daring.cwi.nl'    # The remote host
PORT = 50007              # The same port as used by the server
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
s.send('Hello, world')
data = s.recv(1024)
s.close()
print 'Received', repr(data)

这是perhttp://docs.python.org/release/2.5.2/lib/socket-example.html

只需在服务器端编写一些函数,检查文件,然后s.send(“找到文件”)或任何您想要的东西。在

你似乎有一个很好的开始,以及一些好的建议。在

您可能需要创建一个微型命令解释器,一个命令用于文件长度,另一个命令用于处理您需要执行的其他任务。一个大的if/elif/elif/../else就在你的main之后接收插座()应该这样做。在

但是,在编写套接字程序时,如果假定套接字.send()和你的接收插座()的。TCP套接字保留聚合多个套接字.send()分为一个数据包,或将一个数据包拆分为多个接收数据包,以及其他任何大小的数据包它可以考虑对性能或可靠性进行更改。在

因为这个原因,我喜欢用我的bufsock.py模块,使长度重新排列成为无问题的问题,并且只需同时检索数据: http://stromberg.dnsalias.org/~dstromberg/bufsock.html

顺便说一句,根据您需要的信息类型,只需sshfs或CIFS或NFS文件系统,并像访问本地文件系统一样访问它可能更容易。在

无论如何,如果您希望或需要使用套接字,下面是Python3中的一个示例。这是基于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)

高温:)

相关问题 更多 >