天天看點

Python實作--區域網路兩台Windows裝置互通剪貼闆

前段時間心生一念想搞一個同步剪貼闆,嘗試過通過藍牙傳輸,但是發現藍牙傳輸内容和編譯受限制,是以選擇了通過網絡傳輸,頭一次接觸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裝置的剪貼闆互通純屬個人娛樂,距離最後的目标還是有一定的距離