使用Java与Flex建立Socket连接(已解决沙箱问题)

Socket与其他的通信技术最大的不同是Socket连接在数据传输完成后不会自动关闭,因此服务器可以在任何时间主动发送数据给客户端.
Flex下Socket连接的方式有Socket和XMLSocket两种.

读取数据使用的是异步的方式,需要监听对应的事件
socket.addEventListener( ProgressEvent.SOCKET_DATA, onSocketData );
xmlSocket.addEventListener( DataEvent.DATA, onData );

写入数据的方式
socket下比较常用的是writeUTFBytes(String),writeMultiByte()可以自定义编码,
使用flush()发送数据
xmlScoket下 .send(String)

连接Socket的方式
socket.connect( "localhost", 2900 ); //代表地址和端口

如果要跨域连接服务器,需要加载策略文件
Security.loadPolicyFile("url/crossdomain.xml");

例子使用Java建立Socket服务器,然后使用Flex连接,并且进行数据交互

Java代码
import java.net.*;
import java.io.*;
public class Jserver2 {
 private DataInputStream reader; // 负责输入
 private DataOutputStream writer; // 套接字输出流
 private ServerSocket server; // 服务器套接字
 private Socket socket; // 套接字
 private ServerSocket licServer;
 private Socket licSocket;
 private String sLic;
 private int iCanGet;
 public Jserver2() {
 } // 缺省构造函数
 void startServer() // 启动服务器
 {
  try {
   sLic = "";
   sLic = sLic
     + "";
   sLic = sLic + "";
   sLic = sLic
     + "";
   sLic = sLic + "
/0";
   licServer = new ServerSocket(843);
   licSocket = licServer.accept();
   BufferedReader br = new BufferedReader(new InputStreamReader(
     licSocket.getInputStream(), "UTF-8"));
   PrintWriter pw = new PrintWriter(licSocket.getOutputStream());
   char[] by = new char[22];
   br.read(by, 0, 22);
   String s = new String(by);
   System.out.println("s=" + s);
   if (s.equals("")) {
    System.out.println("接收policy-file-request");
    pw.print(sLic);
    pw.flush();
    br.close();
    pw.close();
    licSocket.close();
   }
   server = new ServerSocket(9100); // 创建服务器套接字
   System.out.println("服务器套接字建立完毕");
   while (true) {
    System.out.println("等待客户端GG");
    socket = server.accept(); // 若客户端GG提出连接请求,与socket连接
    reader = new DataInputStream(socket.getInputStream()); // 获取socket输入流,
    System.out.println("55");
    // utf8-8
    // 这个编码设置是为了更好显示中文
    writer = new DataOutputStream(socket.getOutputStream());// 获取套接字的输出流
    System.out.println("1");
    System.out.println("2");
    writer.writeUTF(sLic);
    System.out.println("4");
    writer.flush();
    System.out.println(sLic);
    System.out.println("完成与客户端的连接");
                iCanGet=100;
    getMessage();// 读取来自客户端的数据,并输出至画面上
   }
  } catch (Exception e) {
   System.out.println(e);
  } finally {
   try {
    if (server != null)
     server.close();// 关闭服务器套接字。
   } catch (IOException ie) {
   }
  }
 }
 void getMessage() // 读取来自套接字的信息
 {
  try {
   System.out.println("MSG");
   while (iCanGet>0) // 循环
   {      
    String sClinet = reader.readLine();     
    System.out.println("客户端GG说:" + sClinet);
   }
  } catch (Exception e) {
  } finally {
   System.out.println("客户端中断连接");
   try {
    if (reader != null)
     reader.close(); // 关闭套接字的输入流
    if (socket != null)
     socket.close(); // 关闭套接字
    reader = null;
    socket = null;
    iCanGet=0;
   } catch (Exception e) {
   }
  }
 }
 public static void main(String[] args) {
  Jserver2 server = new Jserver2();
  server.startServer();
 }
}
-----------------------------------------------------------------------------------------------------------------
FLEX代码


 
     import flash.net.Socket;
   import flash.utils.ByteArray;
   
   private var socket1:Socket;
   
   //初始化程序
   public function initApp():void     
   { 
    Security.loadPolicyFile("xmlsocket://127.0.0.1:843"); 
        socket1=new Socket();             //定义Socket,准备好情书的信封
    socket1.connect("127.0.0.1",9100); //连接服务器
    myText.text=myText.text+"CONNECT...";
    //socket1.writeUTF("");
    //socket1.flush();     
    //myText.text=myText.text+"policy-file-request...";
    socket1.addEventListener(Event.CONNECT,funConnect); //监听是否连接
    socket1.addEventListener(Event.CLOSE,funClose); //监听连接关闭
   }
   internal function funConnect(event:Event):void
   {
    myText.text+="连接已建立 /n";
   }
   internal function funClose(event:Event):void
   {
    myText.text+="连接已关闭 /n";
   }
   
   internal function sendMessage(msg:String):void//发送数据对应按钮click事件    {
   { 
    var message:ByteArray=new ByteArray();//新建一个ByteArray存放数据
    message.writeUTFBytes(msg +"/r/n/0");//写入数据,writeUTFBytes方法,以utf-8格式传数据避免中文乱码
    socket1.writeBytes(message);      //写入Socket的缓冲区
    socket1.flush();                 //调用flush方法发送信息
    myText.text+=msg+"/r/n";         //在客户端屏幕上输出发送的内容
    loveInput.text=""; //清空发言框
   }
  ]]>
 

 
 
 
 

你可能感兴趣的:(Flex,socket,flex,java,string,服务器,exception)