我这边遇到一个简单的需求
怎么回事呢? 我需要长期更新代码到另外一个地方备份,有的时候是一天一次,有的时候是一天几次,每次都是对比过去很是麻烦,后来想到搞了一台机器专门来干这个事,脚本也在这个机器上,但是有一个问题,就是每次都得去这个电脑上操作,也甚是不爽,所以就在想,能不能在那个机器上装一个指令接收器类似的东西,然后我发送指令就自动执行脚本,原先也是想有向日葵等远程软件,但是也不是十分爽,于是我就想到python,后面经过2个小时的时间就把这个想法实现了。
在远端电脑上起一个socket线程,一直监听消息,然后再另外一台电脑上发送socket指令,远端电脑收到指令就会去执行脚本代码。类似于服务端 和 客户端通信。
服务端代码:
# coding=utf-8
import os
import socket
import shutil
import subprocess
import Queue
import threading
#代码路径
path = 'F:\\work\\client\\001\\runtime\\gameclient\\'
#需要拷贝的目标路径
copypath = 'F:\\peizhibiao\\001\\06_Client\\'
# 明确配置变量
ip_port = ('192.168.2.95',8080)
back_log = 5
buffer_size = 1024
def update():
print('start updata code...')
#先执行清理,再执行更新
#cmd = "svn cleanup " + path
#os.system(cmd)
#执行更新
#先更新自己的代码
cmd = "svn up " + path + "res"+ " --non-interactive"
os.system(cmd)
cmd = "svn up " + path + "src"+ " --non-interactive"
os.system(cmd)
cmd = "svn up " + path + "RunTime"+ " --non-interactive"
os.system(cmd)
#再更新到需要copy的代码
cmd = "svn up " + copypath + "res"+ " --non-interactive"
os.system(cmd)
cmd = "svn up " + copypath + "src"+ " --non-interactive"
os.system(cmd)
cmd = "svn up " + copypath + "RunTime"+ " --non-interactive"
os.system(cmd)
copy(path+"res",copypath+"res")
copy(path+"src",copypath+"src")
copy(path+"RunTime",copypath+"RunTime")
commit(copypath)
print("update success")
def copy(yuan,target):
'''将一个目录下的全部文件和目录,完整地<拷贝并覆盖>到另一个目录'''
# yuan 源目录
# target 目标目录
print("startcopy..."+target)
if not (os.path.isdir(yuan) and os.path.isdir(target)):
# 如果传进来的不是目录
# print("传入目录不存在")
return
for a in os.walk(yuan):
#递归创建目录
for d in a[1]:
dir_path = os.path.join(a[0].replace(yuan,target),d)
if not os.path.isdir(dir_path):
os.makedirs(dir_path)
#递归拷贝文件
for f in a[2]:
dep_path = os.path.join(a[0],f)
arr_path = os.path.join(a[0].replace(yuan,target),f)
shutil.copy(dep_path,arr_path)
#def copy(path,copypath):
#if not os.path.exists(copypath):
#print('copypath is no exist!')
#return
#if os.path.exists(copypath):
#shutil.rmtree(copypath)
#print("start copy...")
#shutil.copytree(path, copypath)
def commit(path):
print("start commit...")
os.chdir(path)
print("dir:"+os.getcwd())
cmd = "svn add " + path +" --no-ignore --force"
os.system(cmd)
cmd = "svn commit -m 'publicclient' "+path
os.system(cmd)
#update()
#os.system("pause")
# 创建一个TCP套接字
t1 = None
ser = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 套接字类型AF_INET, socket.SOCK_STREAM tcp协议,基于流式的协议
ser.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) # 对socket的配置重用ip和端口号
# 绑定端口号
ser.bind(ip_port) # 写哪个ip就要运行在哪台机器上
# 设置半连接池
ser.listen(back_log) # 最多可以连接多少个客户端
print('server open...')
while 1:
# 阻塞等待,创建连接
print('server Waiting...')
con,address = ser.accept() # 在这个位置进行等待,监听端口号
while 1:
try:
# 接受套接字的大小,怎么发就怎么收
msg = con.recv(buffer_size)
if msg.decode('utf-8') == '1':
print('received message:',msg.decode('utf-8'))
t1 =threading.Thread(target=update,args=())
t1.start()
# 断开连接
con.close()
except Exception as e:
break
# 关闭服务器
print('close server!')
ser.close()
客户端代码:
# coding=utf-8
import socket
import os
p = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
p.connect(('192.168.2.95',8080)) #ip 端口
msg = '1' #input('please input')
while 1:
# 防止输入空消息
if not msg:
continue
p.send(msg.decode('utf-8')) # 收发消息一定要二进制,记得编码
print('send success')
#if msg == '1':
break
p.close()
os.system("pause")
其中需要注意的是我的环境是python2.7 缺少的一些库自己去下载,如果在你的电脑上有语法错与的话是因为python版本不一致导致需要自己去解决,,ip地址需要填的是远端的ip地址和端口,本地测试的时候可以填127.0.0.1,但是非同台电脑的时候,需要填写实际的ip地址。
运行之后你会发现,是可以进行自动拷贝操作的了,但是如果说我们在其他的电脑上,没有脚本的时候怎么办呢,用telnet也是可以的,指令如下:
telnet 192.168.2.95 8080
然后输入 1 后面的代码可扩展了,有需要的可以拿去参考查阅。
好了,到了这里总算解决了心腹大患了,今晚吃饭能多吃一碗了。8...