python socket

###socketserver:

https://docs.python.org/3.5/library/socketserver.html

server:

import socketserver

class MyTCPHandler(socketserver.BaseRequestHandler):
def handle(self):
while True:
self.data = self.request.recv(1024).strip()
print("{} wrote:".format(self.client_address[0]))
print(self.data.decode())
if not self.data: break
self.request.sendall(self.data.upper())

if __name__ == "__main__":
HOST, PORT = "localhost", 9999

server = socketserver.ThreadingTCPServer((HOST, PORT), MyTCPHandler)
server.serve_forever()

client:

import socket
client = socket.socket()
client.connect(("localhost", 9999))
while True:
msg = input(">>>:").strip()
if len(msg) == 0: continue
client.send(msg.encode())
data = client.recv(1024)
print("recv data:", data.decode())
client.close()

------------------------------------------------------------------------

#利用socket实现简单的ssh

server:

import os
import socket

server = socket.socket()
server.bind(('localhost', 9999))
server.listen()
while True:
conn, addr = server.accept()
print("new connection:", addr)
while True:
print("等待新指令")
data = conn.recv(1024) #接入客户端发送的指令
if not data:
print("客户端已断开")
break
cmd_res = os.popen(data.decode()).read() #执行客户端发送的指令
print("srv send size:", len(cmd_res))
if len(cmd_res) == 0:
cmd_res = "cmd has no output ....."
conn.send( str(len(cmd_res.encode())).encode("utf-8")) #把结果的大小发送给客户端
conn.recv(1024) #接收客户端确认,访问socket粘包
conn.send(cmd_res.encode("utf-8")) #服务端发送数据
print("send done")
server.close()

 

client:

client = socket.socket()
client.connect(('localhost', 9999))
while True:
cmd = input(">>>:").strip()
if len(cmd) == 0: continue
client.send(cmd.encode("utf-8"))
cmd_res_size = client.recv(1024) #接受命令结果的长度
print("命令结果大小:", cmd_res_size)
client.send(b'ready recv data') #告诉服务端已准备好接收数据
received_size = 0
received_data = b''
while received_size < int(cmd_res_size.decode()):
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实现简单的scp:
server:
import os
import socket
import hashlib

IP='0.0.0.0'
PORT=9000
server = socket.socket()
server.bind((IP,PORT))
server.listen(10)
print("等待连接过来.....")
while True:
conn, addr = server.accept()
while True:
print("等待新指令")
data = conn.recv(1024)
if not data:
print("客户端已断开")
break
cmd,filename = data.decode().split()
#print(filename)
if cmd.startswith("get"):
if os.path.isfile(filename):
file_size = os.stat(filename).st_size
conn.send(str(file_size).encode()) #发送文件大小给客户端
conn.recv(1024) #确认,防止粘包
f = open(filename, "rb")
m = hashlib.md5()
for line in f:
m.update(line)
conn.send(line)
print("file md5:", m.hexdigest())
f.close()
conn.send(m.hexdigest().encode()) #发送md5值
print("send done")
else:
conn.send("0".encode())
elif cmd.startswith("put"):
response_client = conn.recv(1024)
#print(response_client)
file_size = int(response_client.decode())
filename = filename.split("/")[-1]
f = open(filename, "wb")
m = hashlib.md5()
received_size = 0
while received_size < file_size:
if file_size - received_size > 1024:
size = 1024
else:
size = file_size - received_size
data = conn.recv(size)
received_size += len(data)
m.update(data)
f.write(data)
f.close()
new_file_md5 = m.hexdigest()
client_file_md5 = conn.recv(1024)
print("server md5:", new_file_md5)
print("client md5:", client_file_md5.decode())
print("文件接收完成!")
server.close()


clent:
import os
import socket
import hashlib

HOST='0.0.0.0'
PORT=9000
client = socket.socket()
client.connect((HOST, PORT))
while True:
cmd = input(">>>:")
if len(cmd) == 0: continue
if cmd.startswith("get"):
'''下载文件'''
if len(cmd.split()) != 2:
print("输入的参数不正确,请检查!")
continue
client.send(cmd.encode())
response_server = client.recv(1024)
file_size = int(response_server.decode())
if file_size == 0:
print("服务端不存在此文件...")
continue
client.send("我这边已经准备好了,可以开始发送数据啦".encode())
filename = cmd.split("/")[-1]
#print("filename:", filename)
f = open(filename, "wb")
m = hashlib.md5()
received_size = 0
while received_size < file_size:
if file_size - received_size > 1024:
size = 1024
else:
size = file_size - received_size
#print("last received size:", size)
data = client.recv(size)
received_size += len(data)
m.update(data)
f.write(data)
else:
f.close()
new_file_md5 = m.hexdigest()
print("server,client file size:", file_size, received_size)
server_file_md5 = client.recv(1024)
print("server,client file md5:", server_file_md5.decode(), new_file_md5)
print("文件已成功下载.")

elif cmd.startswith("put"):
'''上传文件'''
client.send(cmd.encode())
c,filename = cmd.split()
if os.path.isfile(filename):
file_size = os.stat(filename).st_size
client.send(str(file_size).encode())
f = open(filename, "rb")
m = hashlib.md5()
for line in f:
client.send(line)
m.update(line)
f.close()
client.send(m.hexdigest().encode())
print("文件上传完成.")
else:
print("{0} 文件不存在,请确认.".format(filename))

elif cmd.startswith("quit"):
'''退出'''
break
client.close()

 

posted @ 2017-12-05 17:00  helloworld899  阅读(323)  评论(0编辑  收藏  举报