我不是理论派,那就从实践中成长吧
微博:http://www.weibo.com/willsfanw
python实例练手009
上一篇 /
下一篇 2010-08-04 21:58:37
话说python socket模块用起来挺不错,简单,够快
于是想尝试动手做一个很简单的网络剪切板(cilpboard)
需求:任意两台机器之间互相共享剪切板(cilpboard)里的内容
原理:选择udp来做用起来就较方便,不带参数(接受机器的ip)运行,则以udp服务端运行起来;带参数运行,则以udp客户端运行,发送包含clipboard里的内容的特殊字符串
使用到的模块:
socket 网络相关
win32clipboard win32con 第三方pywin32模块,提供读写clipboard API方法
遇到的问题总结:
1.中文转码处理成setClipboardData能较好识别较麻烦
脚本如下:
01 #!/usr/bin/env python
02 # coding:utf-8
03
04 import socket
05 import win32clipboard as clip
06 import win32con
07 import sys
08
09 ########################################################################
10 class ClipClient():
11
12
13 #----------------------------------------------------------------------
14 def __init__(self,remoteAddress=''):
15 self.host = ''
16 self.port = 45321
17 self.Text = ''
18 self.reAdd = remoteAddress
19
20 #----------------------------------------------------------------------
21 def GetClipData(self):
22 clip.OpenClipboard()
23 tempStr = clip.GetClipboardData(win32con.CF_TEXT)
24 self.Text = tempStr
25 clip.CloseClipboard()
26
27 #----------------------------------------------------------------------
28 def SetClipData(self,clipStr):
29 clip.OpenClipboard()
30 clip.EmptyClipboard()
31 clipTempStr = clipStr.decode('utf-8')
32 clip.SetClipboardData(win32con.CF_UNICODETEXT,clipTempStr)
33 clip.CloseClipboard()
34
35
36
37 #----------------------------------------------------------------------
38 def GetRemoteClipText(self):
39 udp = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
40 udp.bind((self.host,self.port))
41
42 while True:
43 data,addr = udp.recvfrom(1024)
44 tempData = data.split('$')
45 print tempData[0]+'02'+tempData[1]
46 if cmp(tempData[0],'wfclip') == 0:
47 self.Text = tempData[1].decode('gbk').encode('utf-8')
48 break
49 udp.close()
50
51
52 #----------------------------------------------------------------------
53 def SendLocalClipText(self):
54 udp = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
55 print self.Text
56 udp.sendto('%s$%s'%('wfclip',self.Text),(self.reAdd,self.port))
57 udp.close()
58
59 if __name__ == '__main__':
60 if len(sys.argv)<= 1:
61 clipObj = ClipClient()
62 print 'server'
63 clipObj.GetRemoteClipText()
64 clipObj.SetClipData(clipObj.Text)
65 else:
66 clipObj = ClipClient(sys.argv[1])
67 print 'client'
68 clipObj.GetClipData()
69 clipObj.SendLocalClipText()
收藏
举报
TAG: