首页 > 其他分享 >AS3 Socket 通信基础(一)

AS3 Socket 通信基础(一)

时间:2023-05-21 19:05:21浏览次数:52  
标签:AS3 socket 一个 通信 XMLSocket 服务器 连接 Socket


我们先来搞清几个概念,这有助于我们更加了解网络通信!
  1、网络中进程之间如何通信?
   首要解决的问题是如何唯一标识一个进程,否则通信无从谈起!在本地可以通过进程PID来唯一标识一个进程,但是在网络中这是行不通的。其实TCP/IP协议族已经帮我们解决了这个问题,网络层的“ip地址”可以唯一标识网络中的主机,而传输层的“协议+端口”可以唯一标识主机中的应用程序(进程)。这样利用三元组(ip地址,协议,端口)就可以标识网络的进程了,网络中的进程通信就可以利用这个标志与其它进程进行交互。
   2、什么是Socket?
   上面我们已经知道网络中的进程是通过socket来通信的,那什么是socket呢?socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模式来操作。我的理解就是Socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO、打开、关闭),这些函数我们在后面进行介绍。
   socket一词的起源:在组网领域的首次使用是在1970年2月12日发布的文献IETF RFC33中发现的,撰写者为Stephen Carr、Steve Crocker和Vint Cerf。根据美国计算机历史博物馆的记载,Croker写道:“命名空间的元素都可称为套接字接口。一个套接字接口构成一个连接的一端,而一个连接可完全由一对套接字接口规定。”计算机历史博物馆补充道:“这比BSD的套接字接口定义早了大约12年。”
   ---------------------------------------------------------------------分割线----------------------------------------------------------------
   好了,下面来讲讲AS3中的Socket编程。
   我们在使用ActionScript3.0进行Socket编程的时候需要关注下面的问题,我们将在今后的学习中逐个对下面的问题进行讨论,并尽量逐渐的改进我们的程序.
   1.与Socket服务器建立连接. 
   2.向Socket服务器发送数据. 
   3.从Socket服务器读数据. 
   4.同Socket服务器进行握手,并确定收到了什么样的数据和如何处理这些数据. 
   5.与Socket服务器断开,或者当服务器想与你断开的时候发消息给你. 
   6.处理使用Sockets时候引发的错误. 

   1.与Socket服务器建立连接. 
   我们通过调用Socket.connect( )或者XMLSocket.connect( )方法并监听网络连接的事件消息.
    连接一台Socket服务器你需要确定两个信息,一个是Socket服务器的域名或者IP地址,另一个是服务器监听的端口号. 
     无论你使用的是Socket还是XMLSocket类的实例,连接请求都是完全的一样的,两个类都是使用一个名叫connect()的方法,该方法有两个参数: 
host : 
     该参数为字符串类型,可以是一个域名,例如"www.example.com",也可以是一个IP地址,例如"192.168.1.101".如果Socket服务器与你该Flash影片发布的Web服务器是同一个,该参数为Null.
port : 
     该参数为一个表示Socket服务器监听端口的int值.该值最小为1024.除非在服务器中有一个policy文件,用于指定允许端口号小于1024. 

     因为Flash Socket编程是一个异步的过程,connect()方法不会等到一个连接完成后再执行下一行代码的执行.如果你想在一个连接完全执行完之前与一个Socket完全绑定,那么你将会得到一个意想不到的结果,并且你当前的代码将不能工作.
     在尝试一个新的Socket连接的时候我们最好先添加一个连接事件监听器.当一个连接建立成功,Socket或者XMLSocket会发出一个连接事件,这就可以让你知道交互已经准备好了.
     下面举了一个Socket实例与本地Socket服务器的2900端口建立连接的例子:


1. package { 
2. flash.display.Sprite; 
3.    import flash.events.*; 
4.    import flash.net.Socket; 
5. 
6.    public class SocketExample extends Sprite { 
7. 
8.      private var socket:Socket; 
9. 
10.      public function SocketExample(   ) { 
11.        socket = new Socket(   ); 
12.      
13.        // Add an event listener to be notified when the connection 
14.        // is made 
15.        socket.addEventListener( Event.CONNECT, onConnect ); 
16.      
17.        // Connect to the server 
18.        socket.connect( "localhost", 2900 ); 
19.      } 
20.    
21.      private function onConnect( event:Event ):void { 
22.        trace( "The socket is now connected..." ); 
23.      } 
24.    
25.    } 
26. }


复制代码


如果你想通过XMLSocket与服务器建立连接代码也是基本一样的.首先你创建了一个连接事件监听器,然后调用connect()方法.所不同的是Socket实例改为了XMLSocket:


1. package { 
2.    import flash.display.Sprite; 
3.    import flash.events.*; 
4.    import flash.net.XMLSocket; 
5. 
6.    public class SocketExample extends Sprite { 
7. 
8.      private var socket:XMLSocket; 
9. 
10.      public function SocketExample(   ) { 
11.        socket = new XMLSocket(   ); 
12.      
13.        // Add an event listener to be notified when the connection is made 
14.        socket.addEventListener( Event.CONNECT, onConnect ); 
15.      
16.        // Connect to the server 
17.        socket.connect( "localhost", 2900 ); 
18.      } 
19.    
20.      private function onConnect( event:Event ):void { 
21.        trace( "The xml socket is now connected..." ); 
22.      } 
23.    
24.    } 
25. }

复制代码


如果连接失败,可能是下面两种原因的一种:一种是连接立即失败和运行时错误,另一种是如果无法完成连接从而产生一个ioError或者securityError事件.关于错误事件处理信息的描述,我们打算改日讨论.
     请牢记,当与一个主机建立一个Socket连接时,Flash Player要遵守如下安全沙箱规则. 
     1.Flash的.swf文件和主机必须严格的在同一个域名,只有这样才可以成功建立连接. 
     2.一个从网上发布的.swf文件是不可以访问本地服务器的. 
     3.本地未通过认证的.swf文件是不可以访问任何网络资源的. 
     4.你想跨域访问或者连接低于1024的端口,必须使用一个跨域策略文件. 

     如果尝试连接未认证的域或者低端口服务,这样就违反了安全沙箱策略,同时会产生一个securityError事件.这些情况都可以通过使用一个跨域策略 文件解决.无论是Socket对象还是XMLSocket对象的策略文件,都必须在连接之前通过使用 flash.system.Security.loadPolicyFile()方法载入策略文件.具体如下:
     Security.loadPolicyFile("http://www.rightactionscript.com/crossdomain.xml");
     获得的改策略文件不仅定义了允许的域名,还定义了端口号.如果你不设置端口号,那么Flash Player默认为80端口(HTTP协议默认端口).在<allow-access-from>标签中可以使用逗号隔开设置多个端口号.下 面这个例子就是允许访问80和110端口.

<?xml version="1.0"?> 

<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy> 
   <allow-access-from domain="*" to-ports="80,110" /> 
</cross-domain-policy>


下节给下第二步:向Socket服务器发送数据.

标签:AS3,socket,一个,通信,XMLSocket,服务器,连接,Socket
From: https://blog.51cto.com/u_4387387/6320005

相关文章

  • as3 图像颜色渐变中使用matrix
    graphics 对象也可以绘制渐变笔触和填充,而不是纯色笔触和填充。渐变笔触是使用 lineGradientStyle() 方法创建的;渐变填充是使用 beginGradientFill() 方法创建的。 这两种方法接受相同的参数。前四个参数是必需的,即类型、颜色、Alpha 以及比率。其余四个参数是可选的,但对于......
  • springboot集成websocket
    导入依赖1<dependency>2<groupId>org.springframework.boot</groupId>3<artifactId>spring-boot-starter-websocket</artifactId>4</dependency>编写配置类@ConfigurationpublicclassWebSocketConfig{@Beanpub......
  • 深入理解多核处理器的缓存一致性和通信机制
    操作系统级别的上下文切换操作系统级别的上下文切换是指当一个线程在执行过程中发生某种事件(如时间片用完、发生中断等),操作系统需要暂停当前线程的执行,保存其上下文(如寄存器状态、程序计数器、堆栈指针等),并切换到另一个线程继续执行的过程。这种上下文切换是由操作系统内核......
  • permission denied while trying to connect to the Docker daemon socket at unix://
     001、普通用户操作docker遇到如下问题permissiondeniedwhiletryingtoconnecttotheDockerdaemonsocketatunix:///var/run/docker.sock:Get"http://%2Fvar%2Frun%2Fdocker.sock/v1.24/images/json":dialunix/var/run/docker.sock:connect:permissiondenied......
  • c++ socket API使用流程(转)
    原文:https://blog.csdn.net/weixin_43687811/article/details/122657720?spm=1001.2101.3001.6650.16&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-16-122657720-blog-121686590.pc_relevant_multi_platform_featuressor......
  • SpringBoot实现WebSocket发送接收消息 + Vue实现SocketJs接收发送消息
    SpringBoot实现WebSocket发送接收消息+Vue实现SocketJs接收发送消息参考:1、https://www.mchweb.net/index.php/dev/887.html2、https://itonline.blog.csdn.net/article/details/81221103?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2......
  • WebSocket 服务端-SupperWebSocket
    通过对FlectWebsocket和SupperWebSocket的比较,初步总结出WebSocket服务端的实现步骤:建立WebSocket服务,并注册事件(OpendOnMessageReceivedClosed)配置监听地址Fleck的WebSocketServer(url)url="ws://0.0.0.0:10020"而SupperWebSocket.Setup(ip,port)启动监听S......
  • 天翼云CDN全站加速产品对websocket协议的支持
    本文分享自天翼云开发者社区《天翼云CDN全站加速产品对websocket协议的支持》,作者:郭****迎1、背景介绍HTTP协议有一个缺陷:通信只能由客户端发起。这种单向请求的特点,注定了如果服务器有连续的状态变化,客户端要获知就只能使用轮询的方案。轮询是在特定的时间间隔(如每1秒),由浏览......
  • closeSocket:fail task not found, uniapp 微信小程序连接不上mqtt!!!
    原来使用的mqttjs版本为4.3.7,连接一直报错,closeSocket:failtasknotfound。降低mqtt.js版本使用4.1.0。引入mqtt的方式使用importmqttfrom'mqtt/dist/mqtt.js'!!!使用constmqtt=require('mqtt'),require方式也提示无法连接!!!......
  • vue组件通信方式有哪些?
    vue组件通信方式一、props(父向子传值----自定义属性)/$emit(子向父传值-----自定义事件)父组件通过props的方式向子组件传递数据,而通过$emit子组件可以向父组件通信。1.父组件向子组件传值(props)下面通过一个例子说明父组件如何向子组件传递数据:在子组件article.vue中......