您的位置:首页 > 编程语言 > Python开发

Python 第八天学习记录——socket高级用法

2016-09-16 06:47 555 查看

动态导入模块

import importlib
aa = importlib.import_module('lib.aa')
print(aa.C().name)


mod = __import__("lib.aa")
instance = getattr(mod.aa, "C")
obj = instane()
print(obj.name)

mod = __import__("lib.aa")
obj = mod.aa.C()
print(obj.name)


断言

如果断后面的语句是真,继续往下走,若是假,则中断执行

assert type(obj.name) is int


使用socket实现一个远程的ssh命令

服务端

import socket, os
server = socket.socket()
server.bind(('localhost', 9999))

server.listen()

while True:
conn, addr = server.accept()
print("new conn: ", addr)
while True:
print("Waiting for new command")
data = conn.recv(1024)
if not data:
print("client lost connection")
break
print("running command: ", data)
cmd_res = os.popen(data.decode("utf-8")).read()
print("before send", len(cmd_res))
if len(cmd_res) == 0:
cmd_res = "cmd has no output..."

conn.send(str(len(cmd_res.encode("utf-8"))).encode("utf-8"))
conn.send(cmd_res.encode("utf-8"))
print("send done")

server.close()


客户端

import socket
client = socket.socket()
client.connect(('localhost', 9999))

while True:
cmd = input(">>:").stri
4000
p()
if len(cmd) == 0:
continue
client.send(cmd.encode("utf-8"))
cmd_res_size = client.recv(1024)
print("command length:", cmd_res_size)
received_size = 0
received_data = b''
while received_size < int(cmd_res_size.decode("utf-8")):
data = client.recv(1024)
received_size += len(data)
received_data += data
else:
print("cmd_res receive done...", received_size)
print(received_data.decode())

client.close()


使用socket实现一个客户端下载程序

服务端

import socket, os, hashlib
server = socket.socket()
server.bind(('localhost', 9997))

server.listen()

while True:
conn, addr = server.accept()
print("new conn: ", addr)
while True:
print("Waiting for new command")
data = conn.recv(1024)
if not data:
print("client lost connection")
break
cmd, filename = data.decode().split()
print("filename: ", filename)
if os.path.isfile(filename):
f = open(filename, "rb")
m = hashlib.md5()
file_size = os.stat(filename).st_size
conn.send( str(file_size).encode())
conn.recv(1024)
for line in f:
m.update(line)
conn.send(line)
print("file md5:", m.hexdigest())
f.close()
conn.send(m.hexdigest().encode())
else:
print("%s not exists." % filename)

server.close()


客户端

import socket, hashlib
client = socket.socket()
client.connect(('localhost', 9997))

while True:
cmd = input(">>:").strip()
if len(cmd) == 0:
continue
if cmd.startswith("get"):
client.send(cmd.encode())
server_response = client.recv(1024)
print("server response:", server_response)
client.send(b"ready to file")
file_total_size = int(server_response.decode())
received_size = 0
filename = cmd.split()[1]
m = hashlib.md5()
f = open(filename + ".new", "wb")
while received_size < file_total_size:
if file_total_size - received_size > 1024:
size = 1024
else:
size = file_total_size - received_size
data = client.recv(size)
received_size += len(data)
m.update(data)
f.write(data)
else:
new_file_md5 = m.hexdigest()
print("file recv done")
f.close()
server_file_md5 = client.recv(1024)
print("local md5:", new_file_md5)
print("servermd5:", server_file_md5.decode())

client.close()


socket server

服务端

import socketserver

class MyTCPHandler(socketserver.BaseRequestHandler):
def handle(self):
while True:
try:
self.data = self. request.recv(1024).strip()
print("{} wrote:".format(self.client_address[0]))
print(self.data)
if not self.data:
print("client lost connection")
break
self.request.send(self.data.upper())
except ConnectionResetError as e:
print("ERROR:", e)
break

if __name__ == "__main__":
HOST, PORT = "localhost", 9996
#server = socketserver.TCPServer((HOST, PORT), MyTCPHandler)
server = socketserver.ThreadingTCPServer((HOST, PORT), MyTCPHandler)
#server = socketserver.ForkingTCPServer((HOST, PORT), MyTCPHandler)
server.serve_forever()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python