我是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()
请告知是否有其他更简单的方法。 谢谢你的帮助和提前的时间。
答案 0 :(得分: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(“找到文件”)或任何你想要的函数。
答案 1 :(得分:0)
你似乎有一个良好的开端,以及一些好的建议。
您可能希望创建一个微型命令解释器,一个命令用于文件长度,另一个命令用于您需要能够执行的其他每个操作。你的主socket.recv()之后的if / elif / elif /.../ else就是这么做的。
但是,当你编写一个套接字程序时,如果你假设你的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:)