Python实现--局域网两台Windows设备互通剪贴板

526 阅读2分钟

前段时间心生一念想搞一个同步剪贴板,尝试过通过蓝牙传输,但是发现蓝牙传输内容和编译受限制,所以选择了通过网络传输,头一次接触socket,传输过程非常顺利,且直接写入剪贴板,命令行里面可以直接把脚本加到后台,也可以同时开服务端和客户端,让两台电脑的剪贴板完全互通,但目前这个阶段仅限于互通无格式的文字,带格式的文字和图片需要进一步完善

以下为服务端:

import socketserver
import time
import socket
import pyperclip

PORT = 9999  # 设置端口,尽量选一个比较少用的端口
ss = ""


class MyServer(socketserver.BaseRequestHandler):  # 发送
    def handle(self):
        x = self.request
        ip = get_host_ip().encode()  # 发送本机ip地址到客户端
        x.send(ip)
        print("服务已启动!")
        print("本机IP地址:", get_host_ip())
        print("\033[32m服务端两秒种同步一次!\033[0m")  # 绿色字体更醒目
        try:
            while True:
                global ss, n
                client = self.request
                try:
                    p = pyperclip.paste()
                    data = p.encode()
                    if ss == data:
                        time.sleep(2)
                        continue
                    else:
                        client.send(data)
                        ss = data
                        print('内容已同步到客户端')

                except TypeError as E:
                    print(E)
                time.sleep(2)  # 减轻系统压力,两秒钟发送一次
        except ConnectionResetError as C:
            print(C)
        except:
            print("End")
            exit()


def get_host_ip():  # 获取本机IP地址
    try:
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        s.connect(('8.8.8.8', 80))
        ip = s.getsockname()[0]
    finally:
        pass
    return ip


try:
    print("等待连接...")
    server = socketserver.ThreadingTCPServer((get_host_ip(), PORT), MyServer)
    server.serve_forever()  # 发送剪贴板内容给客户端
except KeyboardInterrupt:
    print("服务结束!")

以下为客户端:

import socket

import time

import pyperclip
ss = ""


class Content:
    def receive(self):
        global ss
        s = socket.socket()
        host2 = '192.168.102.230'  # 服务器的IP
        port2 = 9999  # 服务器的发送端口
        s.connect((host2, port2))
        received1 = s.recv(1024).decode()  # 接收服务器IP地址
        print("服务端ip地址", received1)
        while True:
            try:
                received2 = s.recv(1024).decode()
                if received2 == "" or ss == received2:
                    pass
                else:
                    ss = received2
                    print("内容同步完成")
                    pyperclip.copy(received2)
            except AttributeError:
                print("访问服务端错误!")
            time.sleep(2) # 减轻系统压力,两秒钟接收一次


try:
    c = Content()
    c.receive()
except ConnectionResetError:
    pass

客户端中想要做一个抓取广播地址的这么一个方法,但是一直没有实现,保留了接收服务器IP的这个功能,现在看来还算是一个鸡肋,后续功能会补上

之前想着做一个手机和电脑剪贴板同步的,但是由于手机输入法与电脑的不同,还有对python库的不了解,Linux操作系统中剪贴板访问无效等原因,一直无法实现,所以只挑了简单的两台Windows设备的剪贴板互通纯属个人娱乐,距离最后的目标还是有一定的距离