========================
 ģDDEܵSocketʵ
========================

:: limodou
:ϵ: limodou@gmail.com
:汾: $Id: dde.txt 42 2005-09-28 05:19:21Z limodou $
:ҳ: http://wiki.woodpecker.org.cn/moin/NewEdit
:BLOG: http://www.donews.net/limodou
:Ȩ: GPL

.. contents::

DDEǶ̬ݽԭΪWindowsµһ̼ݽĹܣ wxWindows ᵽѾʵЩܣ 
Windows ˵ʹDDELinuxʹSocketģʵ֣ûҵѧϰһЩSocket̷߳ıڼªʵˡΪʲôҪܣԭǣ

1. ʹDDEԱ NewEdit ʵ 
2. дļʱѾڵ NewEdit ʵ򿪴ļ 
3. Windows¿ԷŵԴԱеҼͲ˵УڴĿ¼µļʱӷ㡣

ʵֵḶ́

һDDEģ--DDE.py
-----------------------

::

	1       from socket import *
	2       import threading
	3       import traceback
	4       
	5       ADDR = '127.0.0.1'
	6       PORT = 50000
	7       
	8       server = None
	9       
	10      def init():
	11          server = socket(AF_INET, SOCK_STREAM)
	12          try:
	13              server.bind((ADDR, PORT))
	14          except:
	15      #       traceback.print_exc()
	16              server = None
	17              return server
	18          return server
	19      
	20      def start(server, app=None):
	21          server.listen(1)
	22      #   print 'server starting'
	23          while True:
	24              conn = server.accept()[0]
	25              try:
	26                  data = conn.recv(256)
	27                  if data:
	28                      lines = data.splitlines()
	29                      cmd = lines[0]
	30                      if cmd == 'data':
	31      #                   print 'data'
	32                          if app:
	33                              app.frame.readfiles = lines[1:]
	34                      elif cmd == 'stop':
	35      #                   print 'stop'
	36                          break
	37              except:
	38      #           traceback.print_exc()
	39                  pass
	40          
	41      
	42      def sendraw(cmd, data):
	43          sendSock = socket(AF_INET, SOCK_STREAM)
	44          sendSock.connect((ADDR, PORT))
	45          sendSock.send(cmd+'\n'+data)
	46          sendSock.close()
	47          
	48      def stop():
	49          sendraw('stop', '')
	50          
	51      def senddata(data):
	52          sendraw('data', data)
	53          
	54      def run(app=None):
	55          server = init()
	56          if server:
	57              threading.Thread(target=start, args=(server, app,)).start()
	58              return True
	59          else:
	60              return False

DDE.pyһSocketģʵDDEĹܡʹ50000˿ڣ֪᲻гͻ

init()ǽIPַа󶨣׼һServerɹ˵ǰûNewEditʵʧܣ
˵ǰǰʵΪһͻˣļϢ

start()ǵinit()ɹʱļѭʵ򵥵Э::

	data\n

	Ϊļжļм\n

	stop

	֪ͨر

sendraw()һݵײ㺯

stop()֪ͨ˳

senddata()ڷļ

run()init()ɹ߳̽зѭTrueʾɹ
init()ʧܣ򷵻FalseʾѾڷ

DDEģĵ--DDESupport.py
--------------------------------

ֻǼ˵õĵصʹ::

	1       import DDE
	2       import Mixin
	3       import wx
	4       
	5       def init(app, filenames):
	6           if app.ddeflag:
	7               if not DDE.run(app):
	8       #           print "send data"
	9                   DDE.senddata('\n'.join(filenames))
	10                  return True, False
	11      Mixin.setPlugin('app', 'init', init, Mixin.HIGH, 0)
	12      
	13      def afterclosewindow(win):
	14          if win.app.ddeflag:
	15              DDE.stop()
	16      Mixin.setPlugin('mainframe', 'afterclosewindow', afterclosewindow)
	17      
	18      def init(win):
	19          win.readfiles = []
	20      Mixin.setPlugin('mainframe', 'init', init)
	21      
	22      def on_idle(win, event):
	23          if win.readfiles:
	24              for filename in win.readfiles:
	25                  win.editctrl.new(filename)
	26              win.readfiles = []
	27              win.Show()
	28      Mixin.setPlugin('mainframe', 'on_idle', on_idle)

ҿܶNewEdit ĽṹϤûϵֻ򵥵˵һ¡

DDEĴ֮ǰеģinit()DDE.run()ɹʲôɹ
senddata()еļһʵ()ddeflagʾǷDDEܣֵѡ-nָġ

NewEditԽյļDDE.pyģеstart()(33)ġԿ::

	33                              app.frame.readfiles = lines[1:]

ǰļ뵽readfilesУֱӴ򿪡(lines[1:]1ʼΪһԪdata
)ԭֱдĴ򿪲wxPython˵ǲִ߳ĳЩֻ߳нСûб䷨
һͨķȽļ棬ȻIDLE¼ʱʱϵͳæɨǷֵ򿪣
ٽreadfilesֵΪ[]ɡῴon_idle()Ĵһܡ

˳NewEditʱҪرյ̡߳رգNewEdit޷ڹرNewEdit¼м֪ͨ
̹߳رյafterclosewindow()Ĺ

ЩNewEditͿֻһʵҵһļʱѾһʵǰʵ
Уǽļһʵļ

Windowsϣsendto˵һݷʽʹԴʱԷʹҼ͹ܴ
ļҵĻµĿݷʽΪ::

	C:\Python23\python.exe D:\program\newedit\NewEdit.py

`[]`_

.. _`[]`: technical.htm