我不是理论派,那就从实践中成长吧 微博: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:

 

评分:0

我来说两句

日历

« 2024-05-06  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

  • 访问量: 18189
  • 日志数: 22
  • 建立时间: 2009-12-07
  • 更新时间: 2011-09-26

RSS订阅

Open Toolbar