首先解决的问题是flex的沙箱问题,由于flex 连接服务器存在此问题总是会连接两次服务,首先贴出as文件
package as3.email { import flash.errors.IOError; import flash.events.Event; import flash.events.IOErrorEvent; import flash.events.ProgressEvent; import flash.events.SecurityErrorEvent; import flash.net.Socket; import mx.controls.Alert; public class EmailReceiveSocket extends Socket { private var receiveHandler:Function; private var closedHandler:Function; public function EmailReceiveSocket() { super(); configureListeners(); } public function connectServer(host:String,port:int,token:String,connectHandler:Function,receiveHandler:Function,closedHandler:Function):void{ super.addEventListener(Event.CONNECT, connectHandler); this.closedHandler=closeHandler; this.receiveHandler=receiveHandler; if (host && port) { super.connect(host, port); } } private function configureListeners():void { addEventListener(Event.CLOSE, closeHandler); addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler); addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler); addEventListener(ProgressEvent.SOCKET_DATA, socketDataHandler); } public function writeln(str:String):void { str += "\n"; try { super.writeUTF(str); super.flush(); } catch(e:IOError) { Alert.show(e.message); } } private function readResponse():void { while(super.bytesAvailable) { this.receiveHandler(super.readMultiByte(super.bytesAvailable,"utf8")); } } private function closeHandler(event:Event):void { this.closedHandler(); } private function ioErrorHandler(event:IOErrorEvent):void { Alert.show("ioErrorHandler: " + event); } private function securityErrorHandler(event:SecurityErrorEvent):void { Alert.show("securityErrorHandler: " + event); } private function socketDataHandler(event:ProgressEvent):void { readResponse(); } } }
调用
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="init(event)"> <mx:states> <mx:State name="login_success" id="login_success"> <mx:RemoveChild target="{login}"/> <mx:AddChild position="lastChild"> <mx:Label x="116" y="9" width="682" id="msg"/> </mx:AddChild> <mx:AddChild position="lastChild"> <mx:Button x="88" y="8" width="20" height="20" label="连接状态" fillColors="[red, red]" cornerRadius="30" id="cur_state"/> </mx:AddChild> <mx:AddChild position="lastChild"> <mx:DataGrid x="10" y="35" width="710" height="405" id="grid"> <mx:columns> <mx:DataGridColumn headerText="编号" dataField="id" width="50" textAlign="center"/> <mx:DataGridColumn headerText="标题" dataField="text"/> </mx:columns> </mx:DataGrid> </mx:AddChild> <mx:AddChild position="lastChild"> <mx:Button x="10" y="8" label="连接服务" click="connect(event)" id="conn"/> </mx:AddChild> <mx:AddChild position="lastChild"> <mx:Button x="752" y="418" label="发送" click="send(event)"/> </mx:AddChild> <mx:AddChild position="lastChild"> <mx:TextInput x="726" y="366" id="context"/> </mx:AddChild> </mx:State> </mx:states> <mx:Style source="css/email.css"></mx:Style> <mx:Panel width="327" height="238" layout="absolute" titleStyleName="loginPanelTitle" title="邮箱登录" id="login" right="60" verticalCenter="20" styleName="loginPanel"> <mx:Button x="125.5" y="141" label="login" click="loginAction(event)"/> <mx:Button x="194.5" y="140" label="reset"/> <mx:ComboBox x="91.5" y="30" editable="false" id="service_select" render="service_select_render(data)" width="180"></mx:ComboBox> <mx:TextInput id="username" x="91.5" y="61" width="180" focusIn="clearStyles(event)"/> <mx:TextInput id="password" x="91.5" y="91" displayAsPassword="true" width="180" focusIn="clearStyles(event)"/> <mx:Text x="27.5" y="33" text="邮箱类型"/> <mx:Text x="47.5" y="63" text="账号"/> <mx:Text x="47.5" y="93" text="密码"/> </mx:Panel> <mx:Script> <![CDATA[ import flash.utils.setInterval; import as3.email.EmailReceiveSocket; import mx.rpc.AsyncToken; import mx.rpc.events.ResultEvent; import mx.core.UITextField; import com.google.maps.Color; import com.adobe.serialization.json.JSON; import mx.controls.Alert; import mx.collections.ArrayCollection; import mx.rpc.http.mxml.HTTPService; private var httpServer:HTTPService=new HTTPService(); private var userconfig:Object; private var socket:EmailReceiveSocket=new EmailReceiveSocket(); private var dataArr:ArrayCollection=new ArrayCollection(); private var i:int=1; private function init(evet):void{ var flexRequest:URLRequest=new URLRequest("../email/listRemoteService.do"); var flexload:URLLoader=new URLLoader(); flexload.load(flexRequest); flexload.addEventListener(Event.COMPLETE, function(e:Event):void{ var result=JSON.decode(e.target.data.toString(),true); if(result.success){ var data:Array=result.data; for each(var d:Object in data){ d.label=d.name; } service_select.dataProvider=data; }else{ } }); } private function service_select_render(data:Object):String{ return data.name; } private function loginAction(e):void{ if(username.text.length==0){ username.setStyle("borderColor",Color.RED); return; } if(password.text.length==0){ password.setStyle("borderColor",Color.RED); return; } httpServer.method="POST"; httpServer.url="../system/user/login.do"; var params:Object={}; params.username=username.text; params.password=username.text; params.pop3=service_select.selectedItem.pop3; params.smtp=service_select.selectedItem.smtp; httpServer.addEventListener(ResultEvent.RESULT,loginResult); httpServer.send(params); } private function loginResult(e:ResultEvent):void{ var rst=JSON.decode(e.result.toString(),true); if(rst.success){ userconfig=rst.data; this.currentState="login_success"; }else{ Alert.show(rst.result_msg); } }; private function clearStyles(event:Event):void{ event.currentTarget.setStyle("borderColor",Color.GRAY9); } private function send(e:Event):void{ var message:ByteArray=new ByteArray(); message.writeUTFBytes(this.context.text +"\n"); socket.writeBytes(message); socket.flush(); } private function connect(e:Event):void{ socket.connectServer("192.168.1.254",2567,"",connectHandler,receiveHandler,closedHandler); } private function receiveHandler(data:Object):void{ var obj:Object=new Object(); obj.id=i+""; obj.text=data.toString(); dataArr.addItem(obj); i++; } private function closedHandler():void{ this.cur_state.setStyle("fillColors",[Color.RED]); this.conn.enabled=true; } private function connectHandler(event:Event):void { this.conn.enabled=false; this.cur_state.setStyle("fillColors",[Color.GREEN]); socket.writeln("hello"); socket.flush(); socket.writeln("hello"); socket.flush(); var message:ByteArray=new ByteArray(); message.writeUTFBytes("start" +"\n"); socket.writeBytes(message); socket.flush(); grid.dataProvider=dataArr; } ]]> </mx:Script> </mx:Application>
在java服务端做出如下处理:
package com.lyon.yao.CMessage.email.service.impl;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.util.HashMap;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.lyon.yao.CMessage.email.entry.EmailUser;
import com.lyon.yao.CMessage.email.service.IEMailBasicCongfigService;
import com.lyon.yao.CMessage.email.service.ISocketService;
import com.sun.xml.internal.messaging.saaj.util.ByteInputStream;
/**
* @author lyon.yao
* @date Dec 23, 2011
* @function 邮件socket 服务器 实现
*/
@Service
public class SocketServiceImpl implements ISocketService, Runnable{
@Autowired
private IEMailBasicCongfigService config;
private ServerSocket serverSocket=null;
public static HashMap<String,EmailUser> users=new HashMap<String, EmailUser>(0);
private Thread service=new Thread(this);
private String xml;
public SocketServiceImpl() {
super();
xml="<?xml version=\"1.0\"?>" +
"<!DOCTYPE cross-domain-policy SYSTEM \"http://www.adobe.com/xml/dtds/cross-domain-policy.dtd\">" +
"<cross-domain-policy>" +
"<allow-access-from domain=\"*\" to-ports=\"*\" />" +
"</cross-domain-policy>";
// TODO Auto-generated constructor stub
}
public void start() throws Exception {
// TODO Auto-generated method stub
try {
serverSocket=new ServerSocket(config.getServicesConfig().getPort());
service.start();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void stop() throws Exception {
// TODO Auto-generated method stub
service.stop();
}
@Override
protected void finalize() throws Throwable {
// TODO Auto-generated method stub
if(!serverSocket.isClosed()){
serverSocket.close();
}
super.finalize();
}
public void run() {
// TODO Auto-generated method stub
while(true){
try {
Socket socket= serverSocket.accept();
System.out.println("连接成功```````");
BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream(),"UTF-8"));
PrintWriter pw=new PrintWriter(socket.getOutputStream());
char[] by=new char[22];
br.read(by,0,22);
String head=new String(by);
if(head.equals("<policy-file-request/>")){
pw.write(xml+"\0");
pw.flush();
pw.close();
br.close();
socket.close();
}else{
InnerReaderThread inner=new InnerReaderThread(socket);
inner.start();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
class InnerWriterThread extends Thread{
OutputStream out=null;
Socket socket=null;
InnerWriterThread(Socket socket){
this.socket=socket;
try {
out=socket.getOutputStream();
} catch (IOException e) {
e.printStackTrace();
}
}
public void run() {
while(true){
try {
if(!socket.isClosed()){
out.write("你好".getBytes());
out.flush();
}else{
break;
}
Thread.currentThread().sleep(10000);
} catch (SocketException e) {
// TODO: handle exception
e.printStackTrace();
if(!socket.isClosed()){
try {
socket.close();
System.out.println("socket closed");
} catch (IOException e1) {
e1.printStackTrace();
}
}
break;
}catch (InterruptedException e) {
// TODO: handle exception
e.printStackTrace();
}catch(IOException e){
}
}
}
}
class InnerReaderThread extends Thread{
Socket socket=null;
InputStream input=null;
@Override
public void run() {
// TODO Auto-generated method stub
try {
BufferedReader reader=new BufferedReader(new InputStreamReader(input,"UTF-8"));
String line=null;
InnerWriterThread out=new InnerWriterThread(socket);
out.start();
while((line=reader.readLine())!=null){
System.out.println(line);
if(line.equals("exit")){
if(!socket.isClosed()){
socket.close();
}
}
}
}
catch (IOException e) {
e.printStackTrace();
}
}
public InnerReaderThread(Socket socket) {
super();
// TODO Auto-generated constructor stub
this.socket=socket;
try {
input=socket.getInputStream();
} catch (IOException e) {
e.printStackTrace();
}
}
protected void setSocket(Socket socket){
this.socket=socket;
}
}
}
该类中含有两内部类用来发送和接收数据。
就这么多了,运行如图