java 和 Flex 之间的Socket通信

示例:并采用了amf二进制压缩的传输方式。

flex端代码:

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
      xmlns:s="library://ns.adobe.com/flex/spark"
      xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600"
      creationComplete="fun()">
 <fx:Script>
  <![CDATA[
  
  import mx.controls.Alert;
  
  private var socket:Socket = new Socket();
  
  private function fun():void{
  
  socket.connect("127.0.0.1",8888);
  
  socket.addEventListener(Event.CONNECT,conn);
  
  socket.addEventListener(ProgressEvent.SOCKET_DATA,showData);
  
  socket.addEventListener(Event.CLOSE,disconn);
  
  function conn(e){
  
  Alert.show("conn");
  
  }
  
  function disconn(e){
  
  Alert.show("disconn");
  
  }
  
  function showData(e){
  
  var msg:String="";
  
  while(socket.bytesAvailable){
  
  var bytes:ByteArray = new ByteArray();
  
  socket.readBytes(bytes,0,socket.bytesAvailable);
  
  bytes.uncompress();
  
  var obj:Object = bytes.readObject();
  
  msg += obj.n+":";
  
  msg += obj.keys;
  
  }
  
  result.text += msg;
  
  }
  
  }
  
  function send(){
  
  var txt:String = msg.text;
  
  socket.writeMultiByte(txt+"/n","gbk");
  
  socket.flush();
  
  msg.text="";
  
  }
  
  ]]>
  
 </fx:Script>
 <mx:TextArea x="10" y="10" width="356" height="325" id="result"/>
 
 <mx:TextArea x="10" y="369" width="282" id="msg"/>
 
 <mx:Button x="300" y="391" label="Send" click="send()"/>

</s:Application>

 

服务器端代码:

    主服务器类:

package yaner.mytest;

 

import java.io.IOException;

import java.io.PrintStream;

import java.net.ServerSocket;

import java.net.Socket;

import java.util.Arrays;

import java.util.HashMap;

import java.util.Scanner;

import yaner2.mytest.AmfTool;

public class AmfSocket {

 private ServerSocket socket;

 private Socket client;

 private Scanner in;

 private PrintStream out;

 private AmfTool tool = new AmfTool();

 String line;
 
 public AmfSocket(int port) throws IOException {

  socket = new ServerSocket(port);

 }

 public void start() throws IOException {

  System.out.println("Amf服务器已启动");

  while (true) {

   client = socket.accept();

   in = new Scanner(client.getInputStream());

   out = new PrintStream(client.getOutputStream());

   boolean done = false;

   while (!done) {

    if (in.hasNextLine()) {

      line = in.nextLine();

     if (line.trim().toLowerCase().equals("exit")) {

      done = true;

     } else {

      out();

     }

    } else {

     done = true;

    }

   }

   if (done) {

    client.close();

   }

  }

 }

 private void out() {

  HashMap<String, Object> map = new HashMap<String, Object>();

  map.put("n", "value");

  map.put("keys", line);

  try {

   byte[] bytes = tool.compressOutput(map);

   out.write(bytes);

   System.out.println(Arrays.toString(bytes));

  } catch (IOException e) {

   // TODO Auto-generated catch block

   e.printStackTrace();

  }

 }

 public static void main(String[] args) {

  try {

   new AmfSocket(8888).start();

  } catch (IOException e) {

   // TODO Auto-generated catch block

   e.printStackTrace();

  }

 }

}

 

 

amf转换类:

 

package yaner.mytest;

 

import java.io.ByteArrayOutputStream;

import java.io.DataOutputStream;

import java.io.IOException;

import java.util.zip.Deflater;

import flex.messaging.io.SerializationContext;

import flex.messaging.io.amf.Amf3Output;

public class AmfTool {

private Deflater deflater = new Deflater();

private int cacheSize = 1024;

/**

* 压缩后,进行输入

* @return byte[]

* @throws IOException

*/

public byte[] compressOutput(Object obj) throws IOException{

Amf3Output amfOut = new Amf3Output(new SerializationContext());

ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();

DataOutputStream dataOutStream = new DataOutputStream(byteArrayOutputStream);

amfOut.setOutputStream(dataOutStream);

amfOut.writeObject(obj);

amfOut.flush();

dataOutStream.flush();

byte[] msg = byteArrayOutputStream.toByteArray();

msg = compress(msg);

amfOut.close();

dataOutStream.close();

return msg;

}

/**

* 压缩字节

* @param input

* @return

* @throws IOException

*/

private byte[] compress(byte[] input) throws IOException{

deflater.reset();

deflater.setInput(input);

deflater.finish();

ByteArrayOutputStream outputStream = new ByteArrayOutputStream(input.length);

byte[] buf = new byte[cacheSize];

int len;

while(!deflater.finished()){

len = deflater.deflate(buf);

outputStream.write(buf,0,len);

}

byte[] tmpByte = outputStream.toByteArray();

outputStream.close();

return tmpByte;

}

}

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值