python socket

模拟ssh

server:

import socket
import os

server=socket.socket(socket.AF_INET, socket.SOCK_STREAM) #定义socket,使用tcp协议
server.bind(('127.0.0.1',5000)) #绑定5000端口
server.listen(5)
n=1
while True:#循环接收客户端连接请求
ip,addr=server.accept()#接受客户端连接请求
while True:#循环接受客户端信息
data=ip.recv(1024) #buffer1024,最大为8196
if data:#如果data不为空
print(n)
n+=1
msg=os.popen(data.decode('gb2312')).read() #执行客户端查询命令
if not msg:#如果命令错误
msg='sorry,no output!!!'
msg=msg.encode('gb2312')#查询结果encode为bytes
l=str(len(msg)).encode('gb2312')#将结果的长度变成byte返回给客户端
ip.send(l)
ip.recv(1024) #防止粘包
ip.send(msg)
else:
break

server.close()


client:

import socket
import time
cli=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
cli.connect(('127.0.0.1',5000))#连接5000端口
while True:#循环发送和接受
msg=input('>:')#输入命令
cli.send(msg.encode('gb2312'))#发送命令
print('send is ok')
data=cli.recv(1024)#接受结果的长度
n=int(int(data.decode())/1024)+1 #判断结果需要几次接受完毕,例如n=int(2244/1024)+1
cli.send(b'ok') #防止粘包
r=b''
for i in range(n):#循环接受打印
r+=cli.recv(1024)
print(r.decode('gb2312'))

模仿ftp 

server:

import socket
import os
import hashlib
server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server.bind(('127.0.0.1',9999))
server.listen(6)
cli,addr=server.accept()
n=0

# D:\firefox下载\mysql-connector-java.jar
while True:
n+=1
print(n)
file=cli.recv(1024)#文件路径
d=file.decode('utf-8')
j=os.path.isfile(file) #判断文件是不是存在
if j:#文件存在
s=os.path.getsize(file)
cli.send(str(s).encode('utf-8'))
cli.recv(1024)
m=hashlib.md5()
with open(file,'rb') as f:
for line in f:
m.update(line)
cli.send(line)
cli.recv(1024)
md=m.hexdigest()
cli.send(md.encode('utf-8'))
else:
break

client:

import socket,os
import hashlib
cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
cli.connect(('127.0.0.1', 9999))
while True:
file = input('>')
base=os.path.splitext(file)[0]+'_cp'+os.path.splitext(file)[1]
print(base)
if file:
cli.send(file.encode('utf-8'))
size=cli.recv(1024)
size=int(size.decode('utf-8'))
print(size)
cli.send(b'ok,ready to receive')
recv_size=0
m=hashlib.md5()
with open(base,'wb') as f:
while recv_size<size:
last=size-recv_size
if last>1024:
d=cli.recv(1024)
else:
d=cli.recv(last)
m.update(d)
recv_size+=len(d)
f.write(d)
cli.send(b'copy completely')
md_server=cli.recv(1024)
md_client=m.hexdigest()
if md_client==md_server.decode('utf-8'):
print('copy really completely')
else:
continue

 

posted @ 2017-05-04 11:04  wangxingg  阅读(123)  评论(0)    收藏  举报