前段时间心生一念想搞一个同步剪贴板,尝试过通过蓝牙传输,但是发现蓝牙传输内容和编译受限制,所以选择了通过网络传输,头一次接触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设备的剪贴板互通纯属个人娱乐,距离最后的目标还是有一定的距离