今天是:   | 登录中心 | | 网络导航
logo 来海南旅游咨询 海南旅游 预订海南酒店 自驾租车 海南高尔夫 问路订房就请拔打海南旅游百事通  全天24小时为您守候 设为首页
加入收藏
联系站长
导航页为首页
内容页为首页
当前位置:南国风 >> IT.信息技术 >> game@webdev >> 浏览文章

Flash Socket 编程 示例,flash9以上(2)

作者:佚名 日期:2010年11月02日 来源:本站原创 人气:

现在来写一个flash 客户端,这里要解决的问题包括,

如何连接服务器,

如何监听服务器的内容,

如何发送信息服务器,

现在发一段简单的代码,这个代码很简单,功能不完整,为的是能够清晰一点让我们学习flash socket编程。

view plaincopy to clipboardprint?
package   
{  
    import flash.net.Socket;  
    import flash.events.*;  
    import flash.display.Sprite;  
    import flash.errors.*;  
    import flash.display.SimpleButton;  
    public class Client extends Sprite  
    {  
        private var mysocket:Socket;  
        private var host:String="localhost";  
        private var port:int=8001;  
        public function Client()  
        {  
            btn.addEventListener(MouseEvent.CLICK,SendData);  
            mysocket=new Socket();  
            mysocket.addEventListener(Event.CONNECT,OnConnect);  
            mysocket.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);  
            mysocket.addEventListener(ProgressEvent.SOCKET_DATA , receivedata);  
            //mysocket.addEventListener(SecurityError  
            mysocket.connect(host,port);  
        }  
        private function OnConnect(e:Event):void 
        {  
            trace("连接成功");  
            mysocket.writeUTFBytes("Test successful2\n");  
            mysocket.flush();//发送数据  
 
        }  
        private function ioErrorHandler(e:IOErrorEvent):void 
        {  
            trace("连接失败");  
        }  
        private function receivedata(e:ProgressEvent):void 
        {  
            trace("收到的字节数"+mysocket.bytesAvailable);  
            var msg:String;  
            while (mysocket.bytesAvailable)  
            {  
                msg+=mysocket.readMultiByte(mysocket.bytesAvailable,"utf8");  
                trace(msg);  
            }  
        }  
        private function SendData(e:MouseEvent):void 
        {  
            trace("发送");  
            mysocket.writeUTFBytes("i am flash\n");  
            mysocket.flush();//发送数据  
 
 
        }  
    }  

package
{
 import flash.net.Socket;
 import flash.events.*;
 import flash.display.Sprite;
 import flash.errors.*;
 import flash.display.SimpleButton;
 public class Client extends Sprite
 {
  private var mysocket:Socket;
  private var host:String="localhost";
  private var port:int=8001;
  public function Client()
  {
   btn.addEventListener(MouseEvent.CLICK,SendData);
   mysocket=new Socket();
   mysocket.addEventListener(Event.CONNECT,OnConnect);
   mysocket.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
   mysocket.addEventListener(ProgressEvent.SOCKET_DATA , receivedata);
   //mysocket.addEventListener(SecurityError
   mysocket.connect(host,port);
  }
  private function OnConnect(e:Event):void
  {
   trace("连接成功");
   mysocket.writeUTFBytes("Test successful2\n");
   mysocket.flush();//发送数据

  }
  private function ioErrorHandler(e:IOErrorEvent):void
  {
   trace("连接失败");
  }
  private function receivedata(e:ProgressEvent):void
  {
   trace("收到的字节数"+mysocket.bytesAvailable);
   var msg:String;
   while (mysocket.bytesAvailable)
   {
    msg+=mysocket.readMultiByte(mysocket.bytesAvailable,"utf8");
    trace(msg);
   }
  }
  private function SendData(e:MouseEvent):void
  {
   trace("发送");
   mysocket.writeUTFBytes("i am flash\n");
   mysocket.flush();//发送数据


  }
 }
}

我们首先解决第一个问题:(其实在cookbook那里已经有说的)这里简单演示一下

一.连接服务器:

mysocket=new Socket();
mysocket.addEventListener(Event.CONNECT,OnConnect);

mysocket.connect(host,port);

host :是连接的ip端,这里连接本地所以使用localhost 或者127.0.0.1 就ok

port:端口号只有大于1024的时候基本上可以顺利,小于1024还要进行一些配置

监听连接是否成功:

private function OnConnect(e:Event):void
  {
   trace("连接成功");
   mysocket.writeUTFBytes("Test successful2\n");
   mysocket.flush();//发送数据

  }

连接成功后,我们可以发送一个简单信息给服务器:

mysocket.writeUTFBytes("Test successful2\n");
mysocket.flush();//发送数据

注意,有个\n没有这个回车符,看看会有一些什么发生呢。

使用writeUTFBytes 是不可能立刻发送数据给服务器的,还要使用flush方法才能发送给服务器。

二.处理错误:

mysocket.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);

private function ioErrorHandler(e:IOErrorEvent):void
  {
   trace("连接失败");
  }

三.接收服务器返回的信息

mysocket.addEventListener(ProgressEvent.SOCKET_DATA , receivedata);

private function receivedata(e:ProgressEvent):void
  {
   trace("收到的字节数"+mysocket.bytesAvailable);
   var msg:String;
   while (mysocket.bytesAvailable)
   {
    msg+=mysocket.readMultiByte(mysocket.bytesAvailable,"utf8");
    trace(msg);
   }
  }

这样我们可以接收到服务器发送来的信息,但是存在一个问题,接收数据会存在一个回车符合的问题,需要我们去解决。这里暂时不多说


看上面的

参考:

bytesAvailable : uint

[read-only] 输入缓冲区中可读取的数据的字节数。
readMultiByte(length:uint, charSet:String):String
使用指定的字符集,从该字节流读取一个多字节字符串。
四,发送信息给服务器
 问题:我们希望发送信息给服务器
解决:
使用writeUTFBytes 方法
private function SendData(e:MouseEvent):void
  {
   trace("发送");
   mysocket.writeUTFBytes("i am flash\n");
   mysocket.flush();//发送数据

  }
在场景上放一个按钮上去,通过点击按钮事件,发送信息给服务器socket端口。
参考:
  writeUTFBytes(value:String):void
将一个 UTF-8 字符串写入套接字。

五:服务器程序
这里写一个简单服务器程序,使用一个简单的线程,不过线程并不完善,有缺点,但不影响程序演示:
view plaincopy to clipboardprint?
package com;  
import java.net.*;  
import java.io.*;  
public class Server implements Runnable {  
      
    public void run()  
    {  
         PrintWriter os=null;  
            try{  
            ServerSocket ss=new ServerSocket(8001);  
            System.out.println("等待连接....");  
            Socket sk=ss.accept();  
            System.out.println("连接成功....");  
            BufferedReader br = new BufferedReader(new InputStreamReader(sk.getInputStream(),"utf-8"));   
            System.out.println("获取里面的内容......");   
            //等待接受信息   
            os = new PrintWriter(sk.getOutputStream());   
            String word=null ;  
          //发送信息   
          while((word=br.readLine())!=null)  
          {      
          
           System.out.println("内容:" + word);  
           os.println("你好我是服务器");   
           os.flush();   
          }  
        }  
            catch(IOException ex)  
            {  
                ex.printStackTrace();  
                  
            }  
          
    }  
      
    public static void main(String[] args) {  
      new Thread(new Server()).start();  
    }  
 

package com;
import java.net.*;
import java.io.*;
public class Server implements Runnable {
   
 public void run()
 {
   PrintWriter os=null;
   try{
   ServerSocket ss=new ServerSocket(8001);
   System.out.println("等待连接....");
   Socket sk=ss.accept();
   System.out.println("连接成功....");
   BufferedReader br = new BufferedReader(new InputStreamReader(sk.getInputStream(),"utf-8"));
      System.out.println("获取里面的内容......");
      //等待接受信息
         os = new PrintWriter(sk.getOutputStream());
      String word=null ;
    //发送信息
    while((word=br.readLine())!=null)
    {   
  
     System.out.println("内容:" + word);
     os.println("你好我是服务器");
     os.flush();
    }
  }
   catch(IOException ex)
   {
    ex.printStackTrace();
    
   }
  
 }
 
 public static void main(String[] args) {
   new Thread(new Server()).start();
 }

}
 
接收结果:
等待连接....
连接成功....
获取里面的内容......
内容:Test successful2
内容:i am flash
内容:i am flash
内容:i am flash
内容:i am flash
内容:i am flash

为了让程序更加完善,我们可以将程序修改得更加完善
客户端发送的内容:
连接成功
收到的字节数16
null你好我是服务器
注意:出现null这个结果,也许在服务出现一些小毛笔,但基本发送数据的和接收数据都成功了
程序需要完善的地方:
包括客户端和服务器
处理回车符合问题
最后发现原来在var msg:String="";写上这样null 就不会出现了


 


email:lifat@yeah.net| QQ:_3000_99**61 T先生
  服务指南 | 著作权与商标声明 | 法律声明 | 服务条款 | 隐私声明 |


南国风网站的版权信息:保留所有权力

不良信息举报中心!
琼ICP备15001822号