3 AS 通过Java数据转发实现P2P通信
谈到这里,其实要实现这步就非常容易了,原理上只要将本来Java收到后返回的信息,发到别人这里去,就可以了。原理如下所示
flash_1 -> Java -> flash_2
flash_2 -> Java -> flash_3
flash_3 -> Java -> flash_1
这样任何两个flash之间都能通过java转发了,现在只有一个问题,就是Java怎么知道我的信息要发给谁?其实很简单我们在每个连接连入的时候发送一条注册信息,让Java知道我的名字,而别人只要在字符串前加上我的名字就可以了。
那么在Java里 我们需要两个功能
这里我们用到方法是<空格>
"r s1";这样的一条信息过去,Java服务器要处理为该连接添加一个标识s1,而在这以后任何客户端只要发送
"s1 Hello";就会把"Hello"这个字符串发送给标识为s1的客户端,这样两个flash之间就完全实现了数据互通
"u s1";当离开的时候可以用这个代码来删除s1的标识符
为了简单和安全,我们可以暂设为标识必须是两位,以字母开头,这样的组合已经超过千种,绝对够用了。
这样只要判断空个所出现的位置即可,如果是第二位就是注册或卸载标识,如果是第三位就是字符转发了,如果都没有,那就是错误信息。
把上面的Run里的out.println("rev: "+src+"\0");改成以下信息就可以判断信息是注册还是卸载了
//屏蔽所有长度小于4的信息,不做处理.
if(line.length()<4){
out.write("error: length<4");
out.flush();
line = in.readLine();
continue;
}
//命令字符
if (line.charAt(1)==' '){
//相应客户端命令请求
name = line.substring(2);
switch (line.charAt(0)) {
case 'r':
//注册客户端
if (!registered && name.length()==2){
//为自己加一个ID
Server.clientID.put(name,client);
registered = true;
//返回注册成功
out.write("registeration successed");
out.flush();
}
break;
case 'u':
//删除客户端
Server.clientID.remove(name);
registered = false;
break;
}
}else if (line.charAt(2)==' '){
//这里是转发代码;
}
当然这里用的一些API在前面还要声明过。在线程类里增加两条申明
private String name;
private boolean registered;
构造函数里
registered = false;
当然最重要的是还要在Server的主线程里声明一个放ID的容器
public static HashMap clientID = new HashMap();
这样每个连接都有自己的ID了
现在要做的是在转发了,在上面的转发代码的地方写
send(line.substring(0,2),line.substring(3));
当然send函数还没有定义呢,现在定义
复制内容到剪贴板代码:
public boolean send(String id, String src) throws IOException {
//读取标识的地址
Socket socket = (Socket)Server.clientID.get(id);
if (socket != null){
out = new PrintWriter(socket.getOutputStream(), true);
out.write(src);
out.flush();
return true;
}else{
return false;
}
}
这里我加入了判断id是否存在,当不存在就没有任何操作,并且将操作结果成功与否返回,在send的时候就可以分类成功或不成功分别做什么了。
马上来开两个AS吧,用到我们刚才第一章节里自己封装的as2,把加载成功的地方改成send("r c1\r");和send("r c2\r");
Action Script 2
//file1
var SERVER_PORT:Number = 10086;
var SERVER_IP:String = "127.0.0.1";
conn:Socket = new Socket();
conn.connect(SERVER_IP,SERVER_PORT);
conn.onConnect = function (success:Boolean){
if (success){
write("r c1");
flush();
}
}
//file2
var SERVER_PORT:Number = 10086;
var SERVER_IP:String = "127.0.0.1";
conn:Socket = new Socket();
conn.connect(SERVER_IP,SERVER_PORT);
conn.onConnect = function (success:Boolean){
if (success){
write("c2 hello");
flush();
}
}
依次运行file1,file2看看,file2运行的时候是不是成功收到了一个hello呢?嘿嘿。
这样做虽然底层还是没有实现P2P,但是效果已经达到,如果还是觉得不够理想,那么可以每个客户端都绑定一个Java的ServerSocket,负责收信息,并转发给同绑定Flash,这样虽然没有实现swf的p2p,但是在底层已经p2p了。
admin#flashas.net (#为@) 联系QQ:
:40777822
浙ICP备06033001号