最近一直学习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;???
- const?WILL:0xFB;???
- const?WONT:0xFC;???
- const?DO:int???=?0xFD;???
- const?DONT:0xFE;???
- const?IAC:int??=?0xFF;???
- ??????????
- private?var?serverURL:String;??
- private?var?portNumber:int;??
- private?var?socket:Socket;??
- private?var?ta:TextArea;??
- private?var?state: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?connectn");??
- ????????}??????????
- private?function?closeHandler(event:Event): ?????????????msg("closed...n");??
- private?function?errorHandler(event:ErrorEvent): ????????????msg(event.text?+?"n");??
- private?function?dataHandler(event:ProgressEvent): ????????????var?n:int?=?socket.bytesAvailable;????????????
- ??????????????
- while?(--n?>=?0)?{??
- ??????????????????
- ????????????????var?b:int?=?socket.readUnsignedByte();????????????????
- ????????????????switch?(state)?{??
- ????????????????????case?0:??
- ??????????????????????????
- ????????????????????????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;??
- 1:??
- //?If?the?current?byte?is?the?"DO"?code,?set?the?state?to?2.??
- if?(b?==?DO)?{??
- 2;??
- ????????????????????????}??
- ??????????????????????
- 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?=? ????????????????}??
- private?function?msg(value:String):void?{?????????????
- ????????????ta.text?+=?value;??
- ????????????ta.dispatchEvent(new?Event(Event.CHANGE));??
- ????????????setTimeout(setScroll,?100);??
- public?function?setScroll(): ????????????ta.verticalScrollPosition?=?ta.maxVerticalScrollPosition;??
- ????????}?????????
- ????}??
- }??
?这个as有的地方没有理解:初始化定义常量时,不知道为什么定义?希望有人能够解释下,小弟不胜感激。
?下面还有个Main .as
package???
import?flash.display.Sprite;??
import?flash.events.MouseEvent;??
import?CustomSocket;??
class?Main?extends?Sprite??
????{?????
private?var?telnetClient:CustomSocket;??
??
public?function?Main()?{??
????????????setupUI();??
private?function?connect(e:MouseEvent)://建立socket通信的链接??
????????????telnetClient?=?new?CustomSocket(serverName.text,?int(portNumber.text),?output);??
private?function?sendCommand(e:MouseEvent): ????????????var?ba:ByteArray?=?new?ByteArray();??
//将得到的信息写入ba中??
????????????ba.writeMultiByte(command.text?+?"n",?"GBK");????
//通过连接写入socket中??
????????????telnetClient.writeBytesToSocket(ba);??
????????????command.text?=?"";??
private?function?setupUI(): ????????????loginBtn.addEventListener(MouseEvent.CLICK,connect)???
????????????sendBtn.addEventListener(MouseEvent.CLICK,sendCommand);??
????????}?????
?最后看看java服务器端
代码一:
简单的MyServer .java
package?com.cn.socket;??
import?java.io.*;???
import?java.net.*;???
class?MyServer???
{???
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();???
??这个服务器端只能连接一段时间后自动停止。
服务器端代码二:
import?java.io.IOException;???
import?java.util.concurrent.*;???
????
class?MultiThreadServer?{???
int?port=4567;???
private?ServerSocket?serverSocket;???
private?ExecutorService?executorService;??
final?int?POOL_SIZE=10;??
???????
public?MultiThreadServer()?throws?IOException{???
????????serverSocket=new?ServerSocket(port);???
??????????
????????executorService=Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()*POOL_SIZE);???
????????System.out.println("服务器启动");???
void?service(){???
true){???
????????????Socket?socket=null;???
try?{???
//接收客户连接,只要客户进行了连接,就会触发accept();从而建立连接???
????????????????socket=serverSocket.accept();???
????????????????executorService.execute(new?Handler(socket));???
???????????????????
catch?(Exception?e)?{???
????????????????e.printStackTrace();???
????????????}???
????????}???
void?main(String[]?args)?throws?IOException?{???
new?MultiThreadServer().service();???
}???
????
?
import?java.io.BufferedReader;???
import?java.io.InputStream;???
import?java.io.InputStreamReader;???
import?java.io.OutputStream;???
import?java.io.PrintWriter;???
class?Handler?implements?Runnable{???
private?Socket?socket;???
public?Handler(Socket?socket){???
this.socket=socket;???
private?PrintWriter?getWriter(Socket?socket)? ????????OutputStream?socketOut=socket.getOutputStream();???
return?new?PrintWriter(socketOut,true);???
private?BufferedReader?getReader(Socket?socket)? ????????InputStream?socketIn=socket.getInputStream();???
new?InputStreamReader(socketIn));???
public?String?echo(String?msg){???
return?"echo:"+msg;???
void?run(){???
????????????System.out.println("New?connection?accepted?"+socket.getInetAddress()+":"+socket.getPort());???
????????????BufferedReader?br=getReader(socket);???
????????????PrintWriter?pw=getWriter(socket);???
????????????String?msg=while((msg=br.readLine())!=null){???
????????????????System.out.println(msg);???
????????????????pw.println(echo(msg));???
if(msg.equals("bye"))???
????????}?catch?(IOException?e)?{???
????????????e.printStackTrace();???
????????}finally{???
if(socket!=null)???
????????????????????socket.close();???
?服务器二建立了线程数量,并且可以不断进行端口连接。
这两中服务器选其一就ok。
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|