python socket 简单应用

我这边遇到一个简单的需求

怎么回事呢? 我需要长期更新代码到另外一个地方备份,有的时候是一天一次,有的时候是一天几次,每次都是对比过去很是麻烦,后来想到搞了一台机器专门来干这个事,脚本也在这个机器上,但是有一个问题,就是每次都得去这个电脑上操作,也甚是不爽,所以就在想,能不能在那个机器上装一个指令接收器类似的东西,然后我发送指令就自动执行脚本,原先也是想有向日葵等远程软件,但是也不是十分爽,于是我就想到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...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值