最近在学Flex,说实话flex代码风格与java很类似,所以学起来不怎么费劲。下面介绍一下我写的flex socket通信,此版本是在本地调试的,所以没有安全沙箱处理。
Flex socket的特点是:
1、发送和接收是异步的。
2、socket的状态都是通过事件监听的。例如接收数据,给socket添加接收数据事件器,如果有数据接收,数据监听器就会触发。
下面是一个小demo,主要功能是发送一个字符串,服务器接收然后返回给客户端,客户端再显示。
Flex
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical"
creationComplete="init()">
<mx:Script>
<![CDATA[
[Bindable]
private var text:String = "";
private var socket:Socket;
private var SEND_HEAD:String = "Send:";
private var RECEIVE_HEAD:String = "Receive:";
private function init():void {
socket = new Socket(); //new出来 ,这时候才能被使用
socket.connect("localhost" , 9999); //连接服务器 , 参数 host:String,prot:int
socket.addEventListener(Event.CONNECT,isConnect); //监听是否连接上服务器
socket.addEventListener(IOErrorEvent.IO_ERROR,isIOError);
socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR,isSecurityError);//安全沙箱
socket.addEventListener(Event.CLOSE,isClose); //监听服务器是否关闭
socket.addEventListener(ProgressEvent.SOCKET_DATA,isData);//获取数据
}
private function isConnect(event:Event):void {
text += "Socket Connect Successful!\n";
}
private function isClose(event:Event):void {
text += "Socket Connect is Close!\n"
}
private function isSecurityError(event:Event):void {
text += "Security Error!\n";
}
private function isIOError(event:Event):void {
text += "IO Error!\n";
}
/**
* 处理接收事件
*/
private function isData(event:Event):void {
if(socket.connected) {
while(socket.bytesAvailable) {
var msg:String = socket.readUTFBytes(socket.bytesAvailable);
text += RECEIVE_HEAD + msg.length + "|" + msg + "\n";
}
}
}
private function sendMsg():void {
var str:String = inputText.text;
if(str != null && str != "") {
if(socket.connected) {
//var b:ByteArray = new ByteArray;
//b.writeUTF(str);
//b.writeMultiByte(str,"UTF-8");
//socket.writeBytes(b);
trace("str: "+str+" length: "+str.length);
//socket.writeUTF(str);
//socket.writeMultiByte(str,"UTF-8");
socket.writeUTFBytes(str);
socket.flush();
text += SEND_HEAD + str + "\n";
inputText.text = "";
}
}
}
]]>
</mx:Script>
<mx:TextArea text="{text}" width="300" height="300"/>
<mx:TextInput id="inputText"/>
<mx:Button label="send" click="sendMsg()"/>
</mx:Application>
java端主要是接收数据并返回接收的数据。java端有简单的线程处理,主要应对简单的多客户端。
FlexServer.java 主程序
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class FlexServer {
public static void main(String[] args) {
ServerSocket ss = null;
Socket socket = null;
SocketThread st = null;
Thread thread = null;
try {
ss = new ServerSocket(9999);
while(true) {
socket = ss.accept();
st = new SocketThread(socket);
thread = new Thread(st);
thread.start();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
if(socket != null) {
socket.close();
}
if(ss != null) {
ss.close();
}
} catch (IOException e) {
}
}
}
}
SocketThread.java 接收线程
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.Socket;
public class SocketThread implements Runnable{
private Socket socket = null;
public SocketThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
DataInputStream reader = null;
DataOutputStream writer = null;
byte[] buffer = null;
try {
if (socket != null) {
reader = new DataInputStream(socket.getInputStream());
writer = new DataOutputStream(socket.getOutputStream());
while(true) {
if(reader.available() == 0) {
continue;
}
buffer = new byte[1024];
int line = reader.read(buffer);
System.out.println(new String(buffer,0,line)+" length: "+line);
/*//异步测试
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
}*/
writer.write(buffer, 0, line);
writer.flush();
buffer = null;
}
} else {
System.out.println("This socket is null");
}
} catch (UnsupportedEncodingException e) {
} catch (IOException e) {
} finally {
try {
if (reader != null) {
reader.close();
}
if (writer != null) {
writer.close();
}
if (socket != null) {
socket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}