python socket 简单应用

116 阅读4分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。 我这边遇到一个简单的需求

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