随笔-254  评论-3298  文章-48  trackbacks-74

Flex与.NET互操作(一):基于Socket的网络连接

     Flash/Flex也支持基于Socket的网络连接 ,服务器端可以是C++,VB,C#,Java等任一语言开发。监听一个网络端口便可以接收到Flash/Flex开发的客户端的连接。     

     ActionScript 3.0提供了通过Socket连接的方式与服务器端通信。这点是超越传统B/S结构的重要特征。这样使得网络通信可以即时连接,避免了HTTP协议无状态连接的弊病。ActionScript 3.0使用XMLSocket类进行连接。需要注意的是使用XMLSocket类进行Socket连接时,不能自动穿过防火墙。要想穿过防火墙连接,则需要使用基于HTTP协议的RTMP协议

     通过查阅Adobe提供的API文档可以了解到,XMLSocket提供了四个公开方法:

     1、XMLSocket(host:String=null,port:int=0)--创建一个新的XMLSocket对象。

     2、close():void--关闭一个XMLSocket。

     3、connect(host:String,port:int):void--连接到指定的TCP端口。

     4、send(object:*):void--将数据发送到连接服务端。

     OK,了解这些后我们就可以用XMLSocket来开发基于Socket的网络及时通信应用。下面通过C#提供一个Socket的服务端,并监听8888端口。示例程序如下:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Net.Sockets;
 6 using System.IO;
 7 
 8 namespace FlashFlexDotNet
 9 {
10     class Program
11     {
12         static void Main(string[] args)
13         {
14             TcpListener listener;
15 
16             try
17             {
18                 listener = new TcpListener(8888);
19             }
20             catch (Exception ex)
21             {
22                 Console.WriteLine(ex.Message);
23                 return;
24             }
25 
26             listener.Start();
27             Console.WriteLine("服务器启动,等待客户端连接.");
28             bool loop = true;
29 
30             while (loop)
31             {
32                 Socket s = listener.AcceptSocket();
33                 NetworkStream ns = new NetworkStream(s);
34                 StreamReader reader = new StreamReader(ns);
35                 string result = string.Empty;
36                 try
37                 {
38                     result = reader.ReadLine();
39                     Console.WriteLine(result);
40                 }
41                 catch (Exception ex)
42                 {
43                     Console.WriteLine(ex.Message);
44                 }
45             }
46         }
47     }
48 }
49 

 

     服务器端Socket已经准备完毕,下面看看客户端的ActionScript的XMLSocket怎么来建立Socket连接与.net的Socket服务端进行通信。

     如本文前介绍,ActionScript 3.0提供了基于Socket的网络连接类XMLSocket,我们可以直接使用它来开发基于Socket的网络通信。如下建立一个基与ActionScript 3.0提供的XMLSocket的网络连接:

1 private function connectionServer():void
2 {
3     xmlConn = new XMLSocket();
4     xmlConn.connect("127.0.0.1",8888);
5 }

 

     随后,便可以通过XMLSocket的实例方法send()向Socket服务端发送消息了。如下代码定义:

1     private function onSend():void
2     {
3         xmlConn.send(txtData.text + "\n");
4     }

 

     客户端完整代码:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" 
 3     backgroundGradientAlphas="[1.0, 1.0]" 
 4     backgroundGradientColors="[#CDCAE6, #FFFFFF]">
 5     <mx:Script>
 6         <![CDATA[
 7             import mx.controls.Alert;
 8             
 9             private var xmlConn:XMLSocket;
10             
11             private function connectionServer():void
12             {
13                 xmlConn = new XMLSocket();
14                 xmlConn.connect("127.0.0.1",8888);
15             }
16             
17             private function onSend():void
18             {
19                 xmlConn.send(txtData.text + "\n");
20             }
21         ]]>
22     </mx:Script>
23     <mx:TextArea x="43" y="34" height="120" width="263" id="txtData"/>
24     <mx:Button x="93" y="180" label="连 接" fontSize="12" click="connectionServer()"/>
25     <mx:Button x="190" y="180" label="发 送" fontSize="12" click="onSend()"/>
26 </mx:Application>

 

     如下为本文示例程序测试结果图:

     

 

版权说明

  本文属原创文章,欢迎转载,其版权归作者和博客园共有。  

  作      者:Beniao

 文章出处:http://beniao.cnblogs.com/  或  http://www.cnblogs.com/

posted on 2009-01-12 23:41 Bēniaǒ 阅读(10914) 评论(36) 编辑 收藏

评论:
#1楼 2009-06-05 16:20 | newbie[未注册用户]
都需要配置什么环境啊?
 回复 引用   
#2楼[楼主] 2009-06-05 19:31 | Bēniaǒ      
@newbie
不需要配置,如上面文章中的Server/Client代码就可以了.

 回复 引用 查看   
#3楼 2009-06-12 21:13 | billmanliu
1.using System.Linq;不能编译
2.new TcpListener(8888);编译时报以下错误
//**
警告 1 “System.Net.Sockets.TcpListener.TcpListener(int)”已过时:“This method has been deprecated. Please use TcpListener(IPAddress localaddr, int port) instead. http://go.microsoft.com/fwlink/?linkid=14202” D:\flex.net\socket\FlashSocket\FlashSocket\Program.cs 18 18 FlashSocket
**/
3.找不到 IPAddress类库及其使用方法
4.我的环境是vs2005
请指教,谢谢.

 回复 引用   
#4楼 2009-06-12 21:28 | billmanliu
第2,3个问题一解决,
但1.using System.Linq;还是不能编译,不知道程序集在哪里,是不是vs 2008以后的版本才有?

 回复 引用   
#5楼 2009-06-12 21:40 | billmanliu
谢谢你的文章.没有用到using System.Linq也能运行正常,假如有空的话,麻烦介绍下Ling的作用,没有时间的话,我自己查找MSDN.
 回复 引用   
#6楼[楼主] 2009-06-13 15:33 | Bēniaǒ      
@billmanliu
System.Linq是.net framework 3.5里发布的新技术,你使用vs2005(.net framework 2.0)默认是没有这个功能的。
Linq是.net framework 3.5的新功能,一种更直接,方便,灵活的查询功能,简单的例子。
1、定义一个数组(下面的写发也是新特性的支持)
var names = string[]{"张三","李四","王五"};
2、查询出数组里是否有“李四”
var result =from n in names where n=="李四";
if(result!="")
{
Console.Write(result);
}

Linq还有对数据库,XML,Object等很多的支持。

 回复 引用 查看   
#7楼 2009-06-14 06:40 | billmanliu
再次谢谢帮助
 回复 引用   
#8楼 2009-07-15 14:34 | wangdan[未注册用户]
服务器端接收到的总是<policy-file-request/>\0
看了很多资料都说是沙箱,安全策略文件的问题.. 可是怎么配也还是这个样子呀.. 请问楼主你是怎么解决的呢.??

 回复 引用   
#9楼[楼主] 2009-07-15 16:54 | Bēniaǒ      
@wangdan
你换个端口试试。

 回复 引用 查看   
#10楼 2009-08-07 14:13 | bino      
楼主用的是VS2008;
不知道TcpListener监听和Socket监听是否有所区别?

 回复 引用 查看   
#11楼[楼主] 2009-08-08 21:49 | Bēniaǒ      
@bino
TcpListener监听和Socket监听的区别,你自己专研下.net的网络编程找答案吧。

 回复 引用 查看   
#12楼 2009-09-21 11:14 | 昕扬      
ActionScript不是直接就支持Socket的吗?为什么用XMLSocket,用Socket应该更方便吧

 回复 引用 查看   
#13楼 2009-09-21 12:40 | 功夫熊猫      
楼主,为什么要要关闭当前网页(Flex运行后的页面)服务器才能接收到发送的数据,否则就会一直等待状态。
 回复 引用 查看   
#14楼[楼主] 2009-09-21 21:33 | Bēniaǒ      
@昕扬
建议你搞清楚下XMLSocket和 Socket的关系 ;

 回复 引用 查看   
#15楼 2009-09-22 16:37 | 昕扬      
引用Bēniaǒ:
@昕扬
建议你搞清楚下XMLSocket和 Socket的关系 ;

我是新手不太明白这两者间的关系,麻烦你帮忙解答一下.
只是我觉得AS3中增加了Socket类,同样可以进行Socket连接,为什么就一定用XMLSocket呢?

 回复 引用 查看   
#16楼 2009-10-12 12:44 | 二德子      
楼主,最后放上代码!
 回复 引用 查看   
#17楼 2009-10-14 21:25 | FISHFISH[未注册用户]
你好,能帮我看个这个问题吗?
http://bbs.airia.cn/Fluorine_remoting/thread-7952-1-1.aspx

 回复 引用   
#18楼[楼主] 2009-10-20 09:57 | Bēniaǒ      
@二德子
文中这样简单的小示例,已经把代码全部放出来了 ,难道只有提供下载的才能说是提供了代码嘛???
自己都不愿意去敲打几下键盘,老是想着别人提供好的拿来就用,这也太懒了吧。

 回复 引用 查看   
#19楼 2010-02-10 15:53 | 木神易      
服务器端接收到的总是<policy-file-request/>\0
看了很多资料都说是沙箱,安全策略文件的问题.. 可是怎么配也还是这个样子呀.. 请问楼主你是怎么解决的呢.??

楼主实在没辙,不知道怎么解决这个问题,请赐教呀!

 回复 引用 查看   
#20楼[楼主] 2010-02-22 08:31 | Bēniaǒ      
@木神易
配置安全策略文件就OK了。

 回复 引用 查看   
#21楼 2010-02-22 21:10 | nightangel[未注册用户]
您好我试用了很多种方法,关于Windows应用程序该如何使用Security

Windows 端
TcpListener tcpListener;

//安全策略文件
string strXml = "<?xml version=\"1.0\"?><cross-domain-policy><allow-access-from domain=\"*\" to-ports=\"*\"/></cross-domain-policy>\0";
try
{
tcpListener = new TcpListener(8888);

}
catch (System.Exception ex)
{
Console.WriteLine(ex.Message);
return;//返回
}
tcpListener.Start();
Console.WriteLine("服务器启动,等待客户端连接......");
bool isLoop = true;
while (isLoop)
{
Socket socket = tcpListener.AcceptSocket();
NetworkStream nStream = new NetworkStream(socket);
StreamReader streamReader = new StreamReader(nStream);
string strResult = string.Empty;
try
{
strResult = streamReader.ReadLine();
if (strResult.Equals("<policy-file-request/>\0"))
{
byte[] bytesPolicy = System.Text.Encoding.UTF8.GetBytes(strXml);
int intbytes = socket.Send(bytesPolicy);
Console.WriteLine(string.Format("您一共发送了{0}字节的数据",intbytes));
}
Console.WriteLine(strResult);
}
catch (System.Exception ex)
{
Console.WriteLine(ex.Message);
}
}

Flex端
Security.loadPolicyFile("xmlsocket://127.0.0.1:8888");

可能是返回数据了,但是好像还有错误,请指教

 回复 引用   
#22楼[楼主] 2010-02-24 10:11 | Bēniaǒ      
@nightangel
代码都是这样写的,关键是要看你的错误到底出在什么地方,什么原因导致的错误。你跟踪下看是否有异常等情况。

 回复 引用 查看   
#23楼 2010-04-02 17:53 | 念时      
Error #2044: 未处理的 securityError:。 text=Error #2048: 安全沙箱冲突:http://localhost:3000/FlexAspNet/flex_bin/FlexSocket.swf 不能从 127.0.0.1:8888 加载数据。
at FlexSocket/connectionServer()[E:\WSY\MyFlex\FlexAspNet\src\FlexSocket.mxml:19]
at FlexSocket/___FlexSocket_Button1_click()[E:\WSY\MyFlex\FlexAspNet\src\FlexSocket.mxml:50]

 回复 引用 查看   
#24楼[楼主] 2010-04-02 22:56 | Bēniaǒ      
@念时
添加了配置文件的么?建议跟踪调试下看看具体的错误信息是什么、

 回复 引用 查看   
#25楼 2010-10-02 23:05 | 旮旯的疙瘩      
谢谢楼主,我需要做一个b/s实时监控系统,看到有人说能用flex或者ajax完成,可是我对这两个方面都是一片空白,但是因为监控程序服务器端是一旦变化发生数据给客户端,那么flex应该使用什么协议呢? 我是新手,期望能看到您的回答,谢谢您!
 回复 引用 查看   
#26楼[楼主] 2010-10-03 20:08 | Bēniaǒ      
@旮旯的疙瘩
使用TCP/IP的socket,rtmp都可以搞定。

 回复 引用 查看   
#27楼 2010-10-04 19:23 | 旮旯的疙瘩      
@Bēniaǒ
谢谢lz回答,我正在按照你的教程实验,能不能推荐本书或者提供些例子,我找了下,网上讲rtmp协议的例子好像很少,谢谢

 回复 引用 查看   
#28楼[楼主] 2010-10-18 00:07 | Bēniaǒ      
@旮旯的疙瘩
这方面暂时还没有比较好的书,我所知道的只有一本书里面提到过点点基础的,不如你在网上收集资料全面。

 回复 引用 查看   
#29楼 2010-12-10 14:26 | 程序新青年      
@billmanliu
2005没有linq,这个项目使用2008创建的

 回复 引用 查看   
#30楼[楼主] 2010-12-10 15:40 | Bēniaǒ      
@旮旯的疙瘩
书上也少,暂时还没有专门讲解rtmp协议的书,国外有本FMS开发指南不过是英文的。

 回复 引用 查看   
#31楼[楼主] 2010-12-10 15:40 | Bēniaǒ      
@程序新青年
对是 ,是 2008下基于.net framewrok 3.5开发的。

 回复 引用 查看   
#32楼 2011-02-17 10:03 | 大侠酷裤马路      
benniao威武,第一个实验成功
 回复 引用 查看   
#33楼 2011-05-09 20:53 | 青穗      
顶 好文
 回复 引用 查看   
#34楼 2011-06-22 14:43 | yaesut[未注册用户]
楼主,关于<polycy-file-request/>的问题,要把你的服务端程序这么改一下,while段:
while (loop)
{
Socket s = listener.AcceptSocket();
NetworkStream ns = new NetworkStream(s);
StreamReader reader = new StreamReader(ns);
string result = string.Empty;
try
{
result = reader.ReadLine();
if (result == @"<policy-file-request/>")
{
string xmlStr = "<cross-domain-policy>"
+ "<site-control permitted-cross-domain-policies='all' />"
+ "<allow-access-from domain='*' to-ports='8888' />"
+ "</cross-domain-policy>";
s.Send(System.Text.UTF8Encoding.UTF8.GetBytes(xmlStr));
s.Close();
}
else
{
Console.WriteLine(result);

}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}

我现在要做一个视频会议的项目,以前没用过这些东西,现在才开始学,以后有机会请楼主多指教,或是发点学习资料到我邮箱

 回复 引用   
#35楼 2011-07-04 01:15 | 牵着你的手      
谢谢您的文章,我正开始读。
 回复 引用 查看   
#36楼[楼主] 2011-07-10 16:07 | Bēniaǒ      
@yaesut
引用yaesut:
楼主,关于<polycy-file-request/>的问题,要把你的服务端程序这么改一下,while段:
while (loop)
{
Socket s = listener.AcceptSocket();
NetworkStream ns = new NetworkStream(s);
StreamReader reader = new StreamReader(ns);
string result = string.Emp...


你好,我写这个只是想说明flex支持socket通信,以及介绍一个简单的本地 socket通信,没有介绍跨域通信,谢谢你的补充。

 回复 引用 查看   
发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 1373921 yG2u5uAE4ao=
微软最有价值专家(MVP)

微软技术社区精英(CNTAC)

2010年IT博客大赛50强

微软最有影响力开发者(GDI)


Bing Maps开发一群:75662563
微软技术群-重庆站:97035589
RIA技术联盟QQ群:26917590
昵称:Bēniaǒ
园龄:4年6个月
荣誉:推荐博客
粉丝:408
关注:26

随笔分类(285)

文章分类(14)

积分与排名

  • 积分 - 760874
  • 排名 - 60

最新评论