ActionScript UDP 通讯测试

其实AS的UDP通讯接口 DatagramSocket出来也蛮久了,今天突然之间头脑发热想研究一下,于是做了个小demo。

UDP和TCP通讯的不同之处,网上搜索大把,大家可以自己科普一下。

在AIR中UDP无需些SeverSocket之类的东西,直接就是DatagramSocket与DatagramSocket之间的通讯,

如果需要接收到别人的信息,那么你就要用到:

bind(localPort:int = 0, localAddress:String = "0.0.0.0"):void
将此套接字绑定到指定的本地地址和端口。

启用此 DatagramSocket 对象可接收绑定 IP 地址和端口上的传入数据包。

如果你只是要发送点什么东西给对方,那么你只需要用到这个:

 send(bytes:ByteArray, offset:uint = 0, length:uint = 0, address:String = null, port:int = 0):void
使用 UDP 发送包含 ByteArray 中字节的数据包。

由于FB的项目设置原因,我把DEMO的接收端和发送端分开写了,代码如下:

监听方代码:

<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" 
                       xmlns:s="library://ns.adobe.com/flex/spark" 
                       xmlns:mx="library://ns.adobe.com/flex/mx" creationComplete="onCreate(event)">
    <fx:Script>
        <![CDATA[
            import mx.events.FlexEvent;
            private var server:DatagramSocket;
            private var socketMap:Dictionary;
            protected function onCreate(event:FlexEvent):void
            {
                socketMap = new Dictionary();
                server = new DatagramSocket();
                server.bind(886,"192.168.3.113");
                server.addEventListener(DatagramSocketDataEvent.DATA, onData);
                server.receive();
            }
            
            private function onData(e:DatagramSocketDataEvent):void
            {
                var msg:String = "Msg from "+e.srcAddress+":"+e.srcPort+ " : "+"length : "+e.data.readShort()+" data: "+e.data.readUTF()+"\n";
                result.appendText(msg);
            }
            
        ]]>
    </fx:Script>
    <fx:Declarations>
        <!-- Place non-visual elements (e.g., services, value objects) here -->
    </fx:Declarations>
    <s:TextArea x="27" y="10" width="343" height="234" id="result"/>
    
</s:WindowedApplication>

推送方代码:

<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" 
                       xmlns:s="library://ns.adobe.com/flex/spark" 
                       xmlns:mx="library://ns.adobe.com/flex/mx" creationComplete="onCreate(event)">
    <fx:Declarations>
        <!-- Place non-visual elements (e.g., services, value objects) here -->
    </fx:Declarations>
    <fx:Script>
        <![CDATA[
            import mx.events.FlexEvent;
            
            private var udpSocket:DatagramSocket;
            
            
            protected function onCreate(event:FlexEvent):void
            {
                trace(DatagramSocket.isSupported);
                udpSocket = new DatagramSocket();
                udpSocket.addEventListener(Event.CONNECT, onConnected);
                udpSocket.addEventListener(DatagramSocketDataEvent.DATA, onData);
                udpSocket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurity);
            }
            
            private function onSecurity(e:SecurityErrorEvent):void
            {
                
            }
            
            private function onConnected(e:Event):void
            {
                
            }
            
            private function onData(e:DatagramSocketDataEvent):void
            {
                
            }
            
            private function doConnect(event:MouseEvent):void
            {
                var ba:ByteArray = new ByteArray();
                ba.writeUTF(input.text);
                var target:ByteArray = new ByteArray();
                target.writeShort(ba.length);
                ba.position=0;
                target.writeBytes(ba);
                udpSocket.send(target,0,target.length,"192.168.3.113",886);
                input.text = "";
            }
        ]]>
    </fx:Script>
    <s:Button id="connectBtn" x="10" y="10" label="CONNECT" click="doConnect(event)"/>
    <s:TextInput x="10" y="39" width="169" height="52" id="input"/>
</s:WindowedApplication>

效果图如下:

 

以上就是全部内容。

2014/06/26

用这个可以做局域网游戏,思路如下:

1 搞个人先建主机,也就是提供一个ServerSocket作为联络服务器

2 其余个人通过Socket连接到此主机

3 主机建立所有子机的连接map,每次有连接或者断开连接的时候更新此map并广播新的ip与端口给其他子机

4 其他自己通过主机的ServerSocket提供的ip和port更新本机的连接池,每次有需要向其他子机广播的时候遍历子机池进行广播

以上内容昨天已经做了,但是测试有些小问题存在,所以源码不提供,因为上面不是什么很难的东西。

原文地址:https://www.cnblogs.com/adoontheway/p/3138168.html