`
wangchao_17915566
  • 浏览: 167621 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

flash as3 的socket聊天

阅读更多

最近一直学习flash as3

今天跟着网上做了一个flash socket 聊天,主要了解下flash如何与java的socket通信。

一段代码CustomSocket.as

package  
{
	import flash.events.*;
    import flash.net.Socket;
    import flash.system.*;
    import flash.utils.ByteArray;
    import flash.utils.setTimeout;
    
    import fl.controls.TextArea;
    import fl.core.UIComponent;
	/**
	* ...
	* @author DefaultUser (Tools -> Custom Arguments...)
	*/
	public class CustomSocket
	{
		private const CR:int = 13; // Carriage Return (CR)
        private const WILL:int = 0xFB; // 251 - WILL (option code)
        private const WONT:int = 0xFC; // 252 - WON'T (option code)
        private const DO:int   = 0xFD; // 253 - DO (option code)
        private const DONT:int = 0xFE; // 254 - DON'T (option code)
        private const IAC:int  = 0xFF; // 255 - Interpret as Command (IAC)
		
		
		private var serverURL:String;
		private var portNumber:int;
		private var socket:Socket;
		private var ta:TextArea;
		private var state:int = 0;
		System.useCodePage = false;
		public function CustomSocket(server:String, port:int, output:TextArea) 
		{
			serverURL = server;
			portNumber = port;
			ta = output;			
			socket = new Socket();
            socket.addEventListener(Event.CONNECT, connectHandler);			
            socket.addEventListener(Event.CLOSE, closeHandler);
            socket.addEventListener(ErrorEvent.ERROR, errorHandler);
            socket.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
            socket.addEventListener(ProgressEvent.SOCKET_DATA, dataHandler);
			
			Security.loadPolicyFile("http://" + serverURL + ":" + portNumber + "/crossdomain.xml");
			
			try
			{ 
				msg("Trying to connect to" + serverURL + ":" + portNumber + "\n");
				socket.connect(serverURL,portNumber);
			}
			catch (error:Error)
			{
				msg(error.message + "\n");
                socket.close();
			}
		}
		public function ioErrorHandler(event:IOErrorEvent):void
		{
			msg("Unable to connect: socket error.\n");
		}
		 public function writeBytesToSocket(ba:ByteArray):void {
			 trace(ba);
            socket.writeBytes(ba);
            socket.flush();
        }
		 private function connectHandler(event:Event):void {			
            if (socket.connected) {
                msg("connected...\n");				
            } else {
                msg("unable to connect\n");
            }
        }        
		private function closeHandler(event:Event):void
		{
			 msg("closed...\n");
		}
		 private function errorHandler(event:ErrorEvent):void {
            msg(event.text + "\n");
        }
	    private function dataHandler(event:ProgressEvent):void {
            var n:int = socket.bytesAvailable;			
            // Loop through each available byte returned from the socket connection.
            while (--n >= 0) {
                // Read next available byte.
                var b:int = socket.readUnsignedByte();				
                switch (state) {
                    case 0:
                        // If the current byte is the "Interpret as Command" code, set the state to 1.
                        if (b == IAC) {
                            state = 1;
                        // Else, if the byte is not a carriage return, display the character using the msg() method.
                        } else if (b != CR) {
                            msg(String.fromCharCode(b));
							}
                        break;
                    case 1:
                        // If the current byte is the "DO" code, set the state to 2.
                        if (b == DO) {
                            state = 2;
                        } else {
                            state = 0;
                        }
                        break;
                    // Blindly reject the option.
                    case 2:
                        /*
                            Write the "Interpret as Command" code, "WONT" code, 
                            and current byte to the socket and send the contents 
                            to the server by calling the flush() method.
                        */
                        socket.writeByte(IAC);
                        socket.writeByte(WONT);
                        socket.writeByte(b);
                        socket.flush();
                        state = 0;
                        break;
                }
            }
        }
		private function msg(value:String):void {			
            ta.text += value;
            ta.dispatchEvent(new Event(Event.CHANGE));
            setTimeout(setScroll, 100);
        }
		 public function setScroll():void {
            ta.verticalScrollPosition = ta.maxVerticalScrollPosition;
        }		
	}
	
}

 这个as有的地方没有理解:初始化定义常量时,不知道为什么定义?希望有人能够解释下,小弟不胜感激。

 下面还有个Main .as

package 
{
	import flash.display.Sprite;
	import flash.events.MouseEvent;
	import flash.utils.ByteArray;
	import CustomSocket;
	
	public class Main extends Sprite
	{	
		private var telnetClient:CustomSocket;

		public function Main() {
			setupUI();
		}
		private function connect(e:MouseEvent):void {
			//建立socket通信的链接
			telnetClient = new CustomSocket(serverName.text, int(portNumber.text), output);
		}
		private function sendCommand(e:MouseEvent):void {			
			var ba:ByteArray = new ByteArray();
			//将得到的信息写入ba中
			ba.writeMultiByte(command.text + "\n", "GBK");	
			//通过连接写入socket中
			telnetClient.writeBytesToSocket(ba);
			command.text = "";
		}
		private function setupUI():void {
			loginBtn.addEventListener(MouseEvent.CLICK,connect)	
			sendBtn.addEventListener(MouseEvent.CLICK,sendCommand);
		}	
	}
}

 最后看看java服务器端

代码一:

简单的MyServer .java

package com.cn.socket;

import java.io.*; 
import java.net.*; 
public class MyServer 
{ 
public static void main (String[] args) throws IOException 
{ 
	ServerSocket server=new ServerSocket(4567); 
	Socket client=server.accept(); 
	BufferedReader in=new BufferedReader(new InputStreamReader(client.getInputStream())); 
	PrintWriter out=new PrintWriter(client.getOutputStream()); 
	while(true) 
	{ 
		String str=in.readLine(); 
		System.out.println(str); 
		out.println("你 说:  " + str + "\n"); 
		out.flush(); 
	if(str.equals("end")) 
	break; 
	} 
	client.close(); 
	} 
}

  这个服务器端只能连接一段时间后自动停止。

服务器端代码二:

package com.cn.socket;

import java.io.IOException; 
import java.net.*; 
import java.util.concurrent.*; 
  
public class MultiThreadServer { 
    private int port=4567; 
    private ServerSocket serverSocket; 
    private ExecutorService executorService;//线程池 
    private final int POOL_SIZE=10;//单个CPU线程池大小 
     
    public MultiThreadServer() throws IOException{ 
        serverSocket=new ServerSocket(port); 
        //Runtime的availableProcessor()方法返回当前系统的CPU数目. 
        executorService=Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()*POOL_SIZE); 
        System.out.println("服务器启动"); 
    } 
     
    public void service(){ 
        while(true){ 
            Socket socket=null; 
            try { 
                //接收客户连接,只要客户进行了连接,就会触发accept();从而建立连接 
                socket=serverSocket.accept(); 
                executorService.execute(new Handler(socket)); 
                 
            } catch (Exception e) { 
                e.printStackTrace(); 
            } 
        } 
    } 
     
    public static void main(String[] args) throws IOException { 
        new MultiThreadServer().service(); 
    } 
  
} 
  

 

package com.cn.socket;
import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.OutputStream; 
import java.io.PrintWriter; 
import java.net.*; 

public class Handler implements Runnable{ 
    private Socket socket; 
    public Handler(Socket socket){ 
        this.socket=socket; 
    } 
    private PrintWriter getWriter(Socket socket) throws IOException{ 
        OutputStream socketOut=socket.getOutputStream(); 
        return new PrintWriter(socketOut,true); 
    } 
    private BufferedReader getReader(Socket socket) throws IOException{ 
        InputStream socketIn=socket.getInputStream(); 
        return new BufferedReader(new InputStreamReader(socketIn)); 
    } 
    public String echo(String msg){ 
        return "echo:"+msg; 
    } 
    public void run(){ 
        try { 
            System.out.println("New connection accepted "+socket.getInetAddress()+":"+socket.getPort()); 
            BufferedReader br=getReader(socket); 
            PrintWriter pw=getWriter(socket); 
            String msg=null; 
            while((msg=br.readLine())!=null){ 
                System.out.println(msg); 
                pw.println(echo(msg)); 
                if(msg.equals("bye")) 
                    break; 
            } 
        } catch (IOException e) { 
            e.printStackTrace(); 
        }finally{ 
            try { 
                if(socket!=null) 
                    socket.close(); 
            } catch (IOException e) { 
                e.printStackTrace(); 
            } 
        } 
    } 
}

 服务器二建立了线程数量,并且可以不断进行端口连接。

这两中服务器选其一就ok。

as3的技术很差,只是为了学习进步。

分享到:
评论
1 楼 foodyi 2009-02-06  
readUnsignedByte () 方法  

public function readUnsignedByte():uint

语言版本 :  ActionScript 3.0
RuntimeVersions:  AIR 1.0, Flash Player 9



从套接字读取一个无符号字节。

var b:int = socket.readUnsignedByte();   

返回socket几种状态的值.

相关推荐

Global site tag (gtag.js) - Google Analytics