3 AS 通過(guò)Java數(shù)據(jù)轉(zhuǎn)發(fā)實(shí)現(xiàn)P2P通信
談到這里,其實(shí)要實(shí)現(xiàn)這步就非常容易了,原理上只要將本來(lái)Java收到后返回的信息,發(fā)到別人這里去,就可以了。原理如下所示
flash_1 -> Java -> flash_2 flash_2 -> Java -> flash_3 flash_3 -> Java -> flash_1
這樣任何兩個(gè)flash之間都能通過(guò)java轉(zhuǎn)發(fā)了,現(xiàn)在只有一個(gè)問(wèn)題,就是Java怎么知道我的信息要發(fā)給誰(shuí)?其實(shí)很簡(jiǎn)單我們?cè)诿總(gè)連接連入的時(shí)候發(fā)送一條注冊(cè)信息,讓Java知道我的名字,而別人只要在字符串前加上我的名字就可以了。 那么在Java里 我們需要兩個(gè)功能
- 個(gè)是增加和刪除自己的標(biāo)識(shí)
- 是識(shí)別字符串中哪些是名字,哪些是信息
這里我們用到方法是<空格> "r s1";這樣的一條信息過(guò)去,Java服務(wù)器要處理為該連接添加一個(gè)標(biāo)識(shí)s1,而在這以后任何客戶(hù)端只要發(fā)送 "s1 Hello";就會(huì)把"Hello"這個(gè)字符串發(fā)送給標(biāo)識(shí)為s1的客戶(hù)端,這樣兩個(gè)flash之間就完全實(shí)現(xiàn)了數(shù)據(jù)互通 "u s1";當(dāng)離開(kāi)的時(shí)候可以用這個(gè)代碼來(lái)刪除s1的標(biāo)識(shí)符 為了簡(jiǎn)單和安全,我們可以暫設(shè)為標(biāo)識(shí)必須是兩位,以字母開(kāi)頭,這樣的組合已經(jīng)超過(guò)千種,絕對(duì)夠用了。 這樣只要判斷空個(gè)所出現(xiàn)的位置即可,如果是第二位就是注冊(cè)或卸載標(biāo)識(shí),如果是第三位就是字符轉(zhuǎn)發(fā)了,如果都沒(méi)有,那就是錯(cuò)誤信息。 把上面的Run里的out.println("rev: "+src+"\0");改成以下信息就可以判斷信息是注冊(cè)還是卸載了
//屏蔽所有長(zhǎng)度小于4的信息,不做處理. if(line.length()<4){ out.write("error: length<4"); out.flush(); line = in.readLine(); continue; } //命令字符 if (line.charAt(1)==' '){ //相應(yīng)客戶(hù)端命令請(qǐng)求 name = line.substring(2); switch (line.charAt(0)) { case 'r': //注冊(cè)客戶(hù)端 if (!registered && name.length()==2){ //為自己加一個(gè)ID Server.clientID.put(name,client); registered = true; //返回注冊(cè)成功 out.write("registeration successed"); out.flush(); } break; case 'u': //刪除客戶(hù)端 Server.clientID.remove(name); registered = false; break; } }else if (line.charAt(2)==' '){ //這里是轉(zhuǎn)發(fā)代碼; }
當(dāng)然這里用的一些API在前面還要聲明過(guò)。在線(xiàn)程類(lèi)里增加兩條申明
private String name; private boolean registered;
構(gòu)造函數(shù)里
registered = false;
當(dāng)然最重要的是還要在Server的主線(xiàn)程里聲明一個(gè)放ID的容器
public static HashMap clientID = new HashMap();
這樣每個(gè)連接都有自己的ID了
現(xiàn)在要做的是在轉(zhuǎn)發(fā)了,在上面的轉(zhuǎn)發(fā)代碼的地方寫(xiě)
send(line.substring(0,2),line.substring(3)); 當(dāng)然send函數(shù)還沒(méi)有定義呢,現(xiàn)在定義 復(fù)制內(nèi)容到剪貼板代碼: public boolean send(String id, String src) throws IOException { //讀取標(biāo)識(shí)的地址 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是否存在,當(dāng)不存在就沒(méi)有任何操作,并且將操作結(jié)果成功與否返回,在send的時(shí)候就可以分類(lèi)成功或不成功分別做什么了。
馬上來(lái)開(kāi)兩個(gè)AS吧,用到我們剛才第一章節(jié)里自己封裝的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(); } }
依次運(yùn)行file1,file2看看,file2運(yùn)行的時(shí)候是不是成功收到了一個(gè)hello呢?嘿嘿。 這樣做雖然底層還是沒(méi)有實(shí)現(xiàn)P2P,但是效果已經(jīng)達(dá)到,如果還是覺(jué)得不夠理想,那么可以每個(gè)客戶(hù)端都綁定一個(gè)Java的ServerSocket,負(fù)責(zé)收信息,并轉(zhuǎn)發(fā)給同綁定Flash,這樣雖然沒(méi)有實(shí)現(xiàn)swf的p2p,但是在底層已經(jīng)p2p了。
資源下載
經(jīng)典論壇交流: http://bbs.blueidea.com/thread-2767774-1-1.html
本文鏈接:http://www.95time.cn/tech/multimedia/2008/5798.asp
出處:藍(lán)色理想
責(zé)任編輯:bluehearts
上一頁(yè) Flash P2P 通信技巧(AS-Java-AS) [4] 下一頁(yè)
◎進(jìn)入論壇RIA設(shè)計(jì)與應(yīng)用版塊參加討論
|