使用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 = "<?xml version=/"1.0/"?>";
   sLic = sLic
     + "<!DOCTYPE cross-domain-policy SYSTEM /"http://www.adobe.com/xml/dtds/cross-domain-policy.dtd/">";
   sLic = sLic + "<cross-domain-policy>";
   sLic = sLic
     + "<allow-access-from domain=/"*/" to-ports=/"80,9100,8080,883,843,834,719/" />";
   sLic = sLic + "</cross-domain-policy>/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("<policy-file-request/>")) {
    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代码
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" fontSize="12" creationComplete="initApp()">
 <mx:Script>
  <![CDATA[
   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("<policy-file-request/>");
    //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=""; //清空发言框
   }
  ]]>
 </mx:Script>
 <mx:TextArea x="10" y="10" width="703" height="263" id="myText"/>
 <mx:TextInput x="10" y="297" width="605" id="loveInput"/>
 <mx:Button x="625" y="298" label="发送情书" id="sendBtn" click="sendMessage(loveInput.text)"/>
</mx:Application>
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值