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