0

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

有什么我可以使用的包吗?

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

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()

请告知是否有其他更简单的方法。提前感谢您的帮助和时间。

4

2 回答 2

0

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

您可能想要创建一个微型命令解释器,一个命令用于文件长度,另一个命令用于您需要能够执行的每项其他操作。一个大的 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 :)

于 2013-11-12T00:26:24.370 回答
0
# 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)

这是根据http://docs.python.org/release/2.5.2/lib/socket-example.html

只需在服务器端编写一些检查文件的函数,然后 s.send("File found") 或任何你想要的。

于 2013-11-11T23:53:45.177 回答