您的位置:首页 > 编程语言 > Java开发

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

2010-10-27 15:13 866 查看

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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐