X-Intend[超级打算]
每个人都有自己的想法,哪怕仅仅一瞬间~!

[转]一个简单的python socket编程

2008年09月07日 作者: KingFo 开发者

原文:http://hi.baidu.com/pplboy/blog/item/c29a4dd45b8d0507a08bb7e7.html

python 编写server的步骤:
 

  1. 第一步是创建socket对象。调用socket构造函数。如:

     

    1. socket = socket.socket( family, type ) 



    family参数代表地址家族,可为AF_INET或AF_UNIX。AF_INET家族包括Internet地址,AF_UNIX家族用于同一台机器上的进程间通信。
    type参数代表套接字类型,可为SOCK_STREAM(流套接字)和SOCK_DGRAM(数据报套接字)。

  2. 第二步是将socket绑定到指定地址。这是通过socket对象的bind方法来实现的:

     

    1. socket.bind( address )  





    由AF_INET所创建的套接字,address地址必须是一个双元素元组,格式是(host,port)。host代表主机,port代表端口号。如果端口号正在使用、主机名不正确或端口已被保留,bind方法将引发socket.error异常。

  3. 第三步是使用socket套接字的listen方法接收连接请求。

     

    1. socket.listen( backlog ) 

    backlog指定最多允许多少个客户连接到服务器。它的值至少为1。收到连接请求后,这些请求需要排队,如果队列满,就拒绝请求。

  4. 第四步是服务器套接字通过socket的accept方法等待客户请求一个连接。

     

    1. connection, address = socket.accept() 



    调 用accept方法时,socket会时入“waiting”状态。客户请求连接时,方法建立连接并返回服务器。accept方法返回一个含有两个元素的 元组(connection,address)。第一个元素connection是新的socket对象,服务器必须通过它与客户通信;第二个元素 address是客户的Internet地址。

  5. 第 五步是处理阶段,服务器和客户端通过send和recv方法通信(传输 数据)。服务器调用send,并采用字符串形式向客户发送信息。send方法返回已发送的字符个数。服务器使用recv方法从客户接收信息。调用recv 时,服务器必须指定一个整数,它对应于可通过本次方法调用来接收的最大数据量。recv方法在接收数据时会进入“blocked”状态,最后返回一个字符 串,用它表示收到的数据。如果发送的数据量超过了recv所允许的,数据会被截短。多余的数据将缓冲于接收端。以后调用recv时,多余的数据会从缓冲区 删除(以及自上次调用recv以来,客户可能发送的其它任何数据)。
  6. 传输结束,服务器调用socket的close方法关闭连接。

python编写client的步骤:
 

  1. 创建一个socket以连接服务器:socket = socket.socket( family, type )
  2. 使用socket的connect方法连接服务器。对于AF_INET家族,连接格式如下:

     

    1. socket.connect( (host,port) ) 

    host代表服务器主机名或IP,port代表服务器进程所绑定的端口号。如连接成功,客户就可通过套接字与服务器通信,如果连接失败,会引发socket.error异常。

  3. 处理阶段,客户和服务器将通过send方法和recv方法通信。
  4. 传输结束,客户通过调用socket的close方法关闭连接。

下面给个简单的例子:

server.py
 

python 代码
 
  1. if __name__ == '__main__':     
  2.     import socket     
  3.      sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)     
  4.      sock.bind(('localhost'8001))     
  5.      sock.listen(5)     
  6.     while True:     
  7.          connection,address = sock.accept()     
  8.         try:     
  9.              connection.settimeout(5)     
  10.              buf = connection.recv(1024)     
  11.             if buf == '1':     
  12.                  connection.send('welcome to server!')     
  13.             else:     
  14.                  connection.send('please go out!')     
  15.         except socket.timeout:     
  16.             print 'time out'     
  17.          connection.close()   

 


client.py
 

python 代码
 
  1. if __name__ == '__main__':     
  2.     import socket     
  3.      sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)     
  4.      sock.connect(('localhost'8001))     
  5.     import time     
  6.     time.sleep(2)     
  7.      sock.send('1')     
  8.     print sock.recv(1024)     
  9.      sock.close()     


在终端运行server.py,然后运行clien.py,会在终端打印“welcome to server!"。如果更改client.py的sock.send('1')为其它值在终端会打印”please go out!“,更改time.sleep(2)为大于5的数值, 服务器将会超时。

被阅 359 次, 0 票  发表评论

[原]关于AS3的MovieClip的addFrameScript()方法个人理解

2008年09月04日 作者: KingFo 原创

网络上都早有了此方法的描述,但是描述的并不太在正确
网络的描述是这样的:
 

  1. addFrameScript(frame:unit,notify:Function):void


相信很多人都尝试过以下输出公共方法的函数
 

  1. describeType(); 

所以通过解析可以明显的看出来是类似:
 

  1. addFrameScript(...args):void

可以理解成为:
 

  1. addFrameScript(frame:Object, notify:Function):void

实际上我的猜测是

 

  1. //伪码  
  2. function addFrameScript(..args):void{  
  3.     var i:int=0;  
  4.     var frame:Object  
  5.     var notify::Function  
  6.     for(;i<args.length;i+=2){  
  7.        frame=args[i];  
  8.        notify=args[i+1];
  9.  //TODO:  
  10.  }  
  11.  

 用法:
 

  1. addFrameScript("frameLabel",func);  
  2. //或  
  3. addFrameScript(1,func); 

 

被阅 417 次, 0 票  发表评论

[原]动态注册点显示对象 AS3实现---Proxy方法

2008年08月26日 作者: KingFo 原创

由于之前的

动态注册点显示对象 AS3实现

不太适合多类型的显示对象DisplayObject复合应用,因此实际应用过程中采用了Proxy模式,这样
只要注册时使用对应的显示对象即可。
 
PS: 由于Blog限制,示例不能再摘要中显示,故请点击文章内部看玩具吧.....
 
示例:
操作:单击确定旋转/缩放点,按下并拖动鼠标则实现以旋转,鼠标滚轮则缩放对应的点。
 

源码:
 

  1. package  com.xintend.util {  
  2.     import flash.display.DisplayObject;  
  3.     import flash.display.Sprite;  
  4.     import flash.geom.Point;  
  5.     import flash.utils.Proxy;  
  6.     import flash.utils.flash_proxy;  
  7.  
  8.       
  9.     /**  
  10.     * [AS3]DynamicRegistrationProxy  
  11.     * 动态注册点代理   引用请保留此处信息及参考信息  
  12.     * @author telds[kingfo] www.xintend.com   
  13.     *   
  14.     *   
  15.     * 一级参考:  
  16.     *   作者: Darronschall        [ActionScript 2]  
  17.     *   站点: http://www.darronschall.com/weblog/archives/000054.cfm  
  18.     *   
  19.     * 二级参考:  
  20.     *   作者:     Robert Penner       [ActionScript 1]  
  21.     *   站点: www.robertpenner.com      
  22.     *   
  23.     */ 
  24.     public dynamic class DynamicRegistrationProxy extends Proxy {         
  25.           
  26.         public function DynamicRegistrationProxy(source:DisplayObject=null):void {  
  27.             _displayObject = source || new Sprite();  
  28.         }  
  29.           
  30.         override flash_proxy function callProperty(methodName:*, ... args):*  {  
  31.             var res:*;  
  32.             var a:Point;  
  33.             var b:Point;  
  34.             var method:String = methodName.toString();  
  35.             var property:String;  
  36.             switch (method) {  
  37.                 case 'setRegistrationByStage':  
  38.                     a = _displayObject.globalToLocal(new Point(args[0], args[1]));                    
  39.                     _stageRegX = args[0];  
  40.                     _stageRegY = args[1];         
  41.                     _regX = a.x;  
  42.                     _regY = a.y;  
  43.                 break;  
  44.                 case 'setRegistrationBySelf':  
  45.                     a = _displayObject.localToGlobal(new Point(args[0], args[1]));                    
  46.                     _regX = args[0];  
  47.                     _regY = args[1];          
  48.                     _stageRegX = a.x;  
  49.                     _stageRegY = a.y;  
  50.                 break;  
  51.                 case 'setPropRel':  
  52.                     a = _displayObject.parent.globalToLocal(_displayObject.localToGlobal(new Point(_regX, _regY)));  
  53.                     property = args[0].toString();  
  54.                     _displayObject[property] = args[1];           
  55.                     b = _displayObject.parent.globalToLocal(_displayObject.localToGlobal(new Point(_regX, _regY)));       
  56.                     _displayObject.x -= b.x - a.x;  
  57.                     _displayObject.y -= b.y - a.y;  
  58.                 break;                
  59.                 default:  
  60.                     res = _displayObject[method].apply(_displayObject, args);  
  61.                 break;  
  62.             }  
  63.             return res;  
  64.         }  
  65.           
  66.         override flash_proxy function getProperty(name:*):* {  
  67.             var res:*;  
  68.             var property:String = name.toString();  
  69.             switch (property) {  
  70.                 case 'regX':  
  71.                     res = _regX;  
  72.                 break;  
  73.                 case 'regY':  
  74.                     res = _regY;  
  75.                 break;  
  76.                 case 'stageRegX':  
  77.                     res = _stageRegX;  
  78.                 break;  
  79.                 case 'stageRegY':  
  80.                     res = _stageRegY;  
  81.                 break;  
  82.                 case 'x2':  
  83.                     res = _x2;  
  84.                 break;  
  85.                 case 'y2':  
  86.                     res = _y2;  
  87.                 break;  
  88.                 case 'scaleX2':  
  89.                     res = _displayObject.scaleX;  
  90.                 break;  
  91.                 case 'scaleY2':  
  92.                     res = _displayObject.scaleY;  
  93.                 break;  
  94.                 case 'rotation2':  
  95.                     res = _displayObject.rotation  
  96.                 break;  
  97.                 case 'source':  
  98.                     res = _displayObject;  
  99.                 break;  
  100.                 default:  
  101.                     res = _displayObject[property];  
  102.                 break;  
  103.             }  
  104.             return res;  
  105.         }  
  106.  
  107.         override flash_proxy function setProperty(name:*, value:*):void {  
  108.             var property:String = name.toString();            
  109.             switch (property) {  
  110.                 case 'regX':  
  111.                     _regX = value;  
  112.                 break;  
  113.                 case 'regY':  
  114.                     _regY = value;  
  115.                 break;  
  116.                 case 'stageRegX':  
  117.                     _stageRegX = value;  
  118.                 break;  
  119.                 case 'stageRegY':  
  120.                     _stageRegY = value;  
  121.                 break;  
  122.                 case 'x2':  
  123.                     _x2 += value - _displayObject.x;  
  124.                 break;  
  125.                 case 'y2':  
  126.                     _y2 += value - _displayObject.y;  
  127.                 break;  
  128.                 case 'scaleX2':  
  129.                     flash_proxy::callProperty('setPropRel',"scaleX", value);  
  130.                 break;  
  131.                 case 'scaleY2':  
  132.                     flash_proxy::callProperty('setPropRel',"scaleY", value);  
  133.                 break;  
  134.                 case 'rotation2':  
  135.                     flash_proxy::callProperty('setPropRel',"rotation", value);  
  136.                 break;  
  137.                 default:  
  138.                     _displayObject[property] = value;  
  139.                     break;  
  140.             }  
  141.         }  
  142.  
  143.           
  144.           
  145.         private var  _displayObject:DisplayObject;  
  146.         private var _regX:Number = 0;  
  147.         private var _regY:Number = 0;  
  148.         private var _stageRegX:Number = 0;  
  149.         private var _stageRegY:Number = 0;  
  150.         private var _x2:Number = 0;  
  151.         private var _y2:Number = 0;  
  152.     }  
  153.       

示例源码:
 

  1. package {  
  2.       
  3.     import com.xintend.util.DynamicRegistrationProxy;  
  4.     import flash.display.Bitmap;  
  5.     import flash.display.Sprite;  
  6.     import flash.events.MouseEvent;  
  7.     import flash.geom.Point;  
  8.       
  9.     public class Main extends Sprite    {  
  10.           
  11.         private var a:DynamicRegistrationProxy;  
  12.         private var t:Sprite = new Sprite();  
  13.         private var c:CrossHairs = new CrossHairs();  
  14.         [Embed(source = '../bin/123.jpg')]private var imge:Class;  
  15.         private var b:Bitmap  
  16.         public function Main():void {  
  17.               
  18.             b=new imge() as Bitmap  
  19.               
  20.             //t.graphics.beginFill(0xFF0000);  
  21.             //t.graphics.drawRect(0, 0, 80, 40);  
  22.             //t.graphics.endFill();  
  23.               
  24.             //t.buttonMode = true;  
  25.             //t.useHandCursor = true;  
  26.               
  27.             t.addChild(b);  
  28.             c.x = t.x = stage.stageWidth / 2- t.width/2;  
  29.             c.y = t.y = stage.stageHeight / 2 - t.height/2;  
  30.               
  31.               
  32.             t.addEventListener(MouseEvent.MOUSE_DOWN, handleMOUSE);  
  33.             t.addEventListener(MouseEvent.MOUSE_OUT, handleMOUSE);  
  34.             t.addEventListener(MouseEvent.MOUSE_WHEEL, handleMOUSE);  
  35.               
  36.             a = new DynamicRegistrationProxy(t);  
  37.               
  38.             addChild(t);  
  39.             addChild(c);  
  40.         }  
  41.           
  42.         private  function handleMOUSE(event:MouseEvent):void {  
  43.             switch(event.type) {  
  44.                 case MouseEvent.MOUSE_DOWN:  
  45.                     a.setRegistrationByStage(mouseX, mouseY);  
  46.                     //trace(t.globalToLocal(new Point(mouseX,0)).x,t.globalToLocal(new Point(0,mouseY)).y);  
  47.                     c.x = mouseX;  
  48.                     c.y = mouseY;  
  49.                     removeEventListener(MouseEvent.MOUSE_DOWN, handleMOUSE);  
  50.                     addEventListener(MouseEvent.MOUSE_MOVE, handleMOUSE);  
  51.                     addEventListener(MouseEvent.MOUSE_UP, handleMOUSE);  
  52.                 break;  
  53.                 case MouseEvent.MOUSE_MOVE:  
  54.                     //trace(t.mouseX - a.regX, t.mouseY - a.regY);  
  55.                     a.rotation2 += 5;  
  56.                     //a.scaleXByRefer += 5;  
  57.                 break;  
  58.                 case MouseEvent.MOUSE_UP:     
  59.                     addEventListener(MouseEvent.MOUSE_DOWN, handleMOUSE);  
  60.                     removeEventListener(MouseEvent.MOUSE_MOVE, handleMOUSE);  
  61.                 break;  
  62.                 case MouseEvent.MOUSE_WHEEL:      
  63.                     removeEventListener(MouseEvent.MOUSE_MOVE, handleMOUSE);  
  64.                     c.x = mouseX;  
  65.                     c.y = mouseY  
  66.                     a.setRegistrationByStage(mouseX, mouseY);  
  67.                     a.scaleX2 += event.delta * 0.1;  
  68.                     a.scaleY2 += event.delta * 0.1;  
  69.                 break;  
  70.                 default:  
  71.                     addEventListener(MouseEvent.MOUSE_DOWN, handleMOUSE);  
  72.                     removeEventListener(MouseEvent.MOUSE_MOVE, handleMOUSE);  
  73.             }  
  74.         }  
  75.     }  
  76. }  
  77. import flash.display.Shape;  
  78.  
  79. class CrossHairs extends Shape {  
  80.     public function CrossHairs() {  
  81.         graphics.lineStyle(2,0xFF0000);  
  82.         graphics.moveTo( -10, 0);  
  83.         graphics.lineTo( 10, 0);  
  84.         graphics.moveTo( 0, -10);  
  85.         graphics.lineTo( 0, 10);  
  86.     }  

 

被阅 394 次, 0 票  发表评论
4 / 7 / 20 | « 1 2 3 4 5 6 7 » |

Google 网上论坛
订阅 XIntend
电子邮件:
访问此论坛

文章分类

站点统计

  • 文章总数: 87 篇
  • 评论总数: 6 条
  • 附件总数: 53 个
  • 留言总数: 0 份
  • 建站日期: 2008-1-1
  • 访问总数: 96446 人次

最新留言

赞助商

友情链接

Design by Free CSS Templates & TiSkin, Powered by Roclog v3.2.13

滇ICP备05000389号, Copyright © 2007 X-Intend[超级打算]. All rights reserved.