其实AS的UDP通讯接口 DatagramSocket出来也蛮久了,今天突然之间头脑发热想研究一下,于是做了个小demo。
UDP和TCP通讯的不同之处,网上搜索大把,大家可以自己科普一下。
在AIR中UDP无需些SeverSocket之类的东西,直接就是DatagramSocket与DatagramSocket之间的通讯,
如果需要接收到别人的信息,那么你就要用到:
将此套接字绑定到指定的本地地址和端口。
与
启用此 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更新本机的连接池,每次有需要向其他子机广播的时候遍历子机池进行广播
以上内容昨天已经做了,但是测试有些小问题存在,所以源码不提供,因为上面不是什么很难的东西。