rtmfp、p2p聊天工具

自己稍微修改下的聊天工具:


package

{

import flash.display.Sprite;

import flash.display.StageScaleMode;

import flash.net.NetConnection;

import flash.net.NetGroup;

import flash.net.GroupSpecifier;

import flash.events.NetStatusEvent;

import flash.events.MouseEvent;

import flash.text.TextFormat;

import flash.events.KeyboardEvent;


public class Main extends Sprite

{

private var px;

private var py;

private var loginPanel;

private var chatPanel;


private var nc:NetConnection;

private var group:NetGroup;

private var userName:String;

private var connected:Boolean = false;

private var keyObj;

private var right:Boolean = true;


public function Main():void

{

stage.scaleMode=StageScaleMode.NO_SCALE;

Init();

}


private function Init()

{

px = stage.stageWidth;

py = stage.stageHeight;

keyObj = {};

login();

}

private function login()

{

loginPanel=new LoginPanel();

loginPanel.x = px / 2 - loginPanel.width / 2;

loginPanel.y = py / 2 - loginPanel.height / 2;

loginPanel.submit.label = "登陸";

loginPanel.submit.addEventListener(MouseEvent.CLICK,loginHandler);

addChild(loginPanel);

}


private function loginHandler(e:MouseEvent)

{

if (loginPanel.nicknameTxt.text == "" || loginPanel.nicknameTxt.length <= 1)

{

echo("請輸入暱稱");

return;

}

else if (loginPanel.passwordTxt.text=="")

{

echo("請輸入密碼");

return;

}

else if (loginPanel.passwordTxt.length<6)

{

echo("你的密碼少於六位");

return;

}

userName = loginPanel.nicknameTxt.text;

echo("歡迎你參加!");

loginPanel.submit.removeEventListener(MouseEvent.CLICK,loginHandler);

removeChild(loginPanel);

showPanel();

}


private function showPanel()

{

chatPanel=new ChatPanel();

chatPanel.x = px / 2 - chatPanel.width / 2;

chatPanel.y = py / 2 - chatPanel.bg.height / 2;

trace(chatPanel.width+"*"+chatPanel.height);


var txtFormat=new TextFormat();

txtFormat.size = 13;

chatPanel.outTxt.editable = false;

chatPanel.inTxt.setStyle("textFormat",txtFormat);

chatPanel.outTxt.setStyle("textFormat",txtFormat);


chatPanel.sendBtn.label = "發送";

chatPanel.sendBtn.width=72;

//chatPanel.mesTxt.text = userName;

chatPanel.sendBtn.addEventListener(MouseEvent.CLICK,clickHandler);

trace(stage);

stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler);

stage.addEventListener(KeyboardEvent.KEY_UP, keyUpHandler);

addChild(chatPanel);

thisTime();

chatPanel.stage.focus = chatPanel.inTxt.textField;

LinkFms();

}


private function keyDownHandler(e:KeyboardEvent)

{

keyObj[e.keyCode] = true;

if (keyObj[17] && keyObj[13])

{

chatPanel.sendBtn.dispatchEvent(new MouseEvent(MouseEvent.CLICK));

chatPanel.inTxt.text = "";

}

}


private function keyUpHandler(e:KeyboardEvent)

{

keyObj[e.keyCode] = false;

}


private function clickHandler(e:MouseEvent)

{

if (chatPanel.inTxt.text != '' && chatPanel.inTxt.text.length > 1)

{

sendMessage(chatPanel.inTxt.text);

chatPanel.inTxt.text = "";

chatPanel.stage.focus = chatPanel.inTxt.textField;

chatPanel.inTxt.setSelection(0,0);

}

}


private function LinkFms()

{

nc=new NetConnection();

nc.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);

nc.connect("rtmfp:");

}


private function netStatusHandler(e:NetStatusEvent)

{

switch (e.info.code)

{

case "NetConnection.Connect.Success" :

//txtUser.text = userName;

//chatPanel.mesTxt.text = userName;

//連接成功,創建需要廣播的羣組

setupGroup();

break;


case "NetGroup.Connect.Success" :

connected = true;

break;


case "NetGroup.Posting.Notify" :

//當獲取到羣組post羣發通知的時候調用相關函數

receiveMessage(e.info.message);

break;


case "NetGroup.Neighbor.Connect" :

case "NetGroup.Neighbor.Disconnect" :

/*for(var i in event.info)

{

trace([i,event.info[i]])

}*/

break;

}

}


private function sendMessage(txt:String):void

{

//注意,post方法傳遞的是一個對象Object,由此大家可以方便的在此對象中添加各種需要傳遞的屬性:)

var message:Object = new Object();

message.text = txt;

//轉換一個peerID的羣組地址,以適合使用sendToNearest()方法。

message.sender = group.convertPeerIDToGroupAddress(nc.nearID);

message.userName = userName;


group.post(message);


receiveMessage(message);

}


private function setupGroup():void

{

/*

GroupSpecifier類可以構造一個傳遞到NetStream和NetGroup的構造函數的加密groupspec字符串。

一個groupspec指定一個RTMFP P2P羣組,包括功能、限制和成員授權等信息。

構造函數中的"myGroup/groupOne"爲羣組標識,可以隨意字符串代替

*/

var groupspec:GroupSpecifier = new GroupSpecifier("myGroup/groupOne");

//設置羣組中post羣發方式是否可用

groupspec.postingEnabled = true;

//指定是否能通過ip多播方式交換更新關於組成員的信息。

groupspec.ipMulticastMemberUpdatesEnabled = true;

/*

將相關的羣組加入某個IP地址並偵聽相關的端口

Multicast的IP地址需要從不低於224開始,端口需高於1024 ————“224.0.0.0:1024”

爲保證唯一性,一般設置高一些比較可靠:)

*/

groupspec.addIPMulticastAddress("225.225.0.1:30303");

//在已成功的連接nc上創建一個羣組;

//groupspecWithAuthorizations:返回一個包含授權的加密的groupspec字符串, 傳給NetGroup的構造函數。

group = new NetGroup(nc,groupspec.groupspecWithAuthorizations());

//爲羣組增加事件偵聽

group.addEventListener(NetStatusEvent.NET_STATUS,netStatusHandler);

}


public function receiveMessage(message:Object):void

{

var txt="<font color='#ff0000'><b>" + message.userName + ":" + "</b></font> "+message.text;

writeText(txt);

//writeText(message.userName+": "+message.text);

}


private function writeText(str:String):void

{

chatPanel.outTxt.condenseWhite = true;

var isTime = thisTime();

chatPanel.outTxt.htmlText +=  "<font color='#ff0000'> 【" + isTime + " 】</font> " + str;

}


private function echo(str)

{

trace(str);

}

private function thisTime()

{

var myDate:Date=new Date();

var myTime:Array=new Array();

myTime[0] = myDate.fullYear;

myTime[1] = myDate.month + 1;

myTime[2] = myDate.date;

myTime[3] = myDate.hours;

myTime[4] = myDate.minutes;

myTime[5] = myDate.seconds;


if (right)

{

var txt:String;

right = false;

if (myTime[3] > 0 && myTime[3] < 6)

{

txt = "清晨好,歡迎光臨:";

}

else if (myTime[3]>=6&&myTime[3]<12)

{

txt = "上午好,歡迎光臨:";

}

else if (myTime[3]>=12&&myTime[3]<18)

{

txt = "下午好,歡迎光臨:";

}

else if (myTime[3]>=18&&myTime[3]<=24)

{

txt = "晚上好,歡迎光臨:";

}

var crazy= "<font color='#ff0000'><b>" +myTime[0]+"年"+myTime[1]+"月"+myTime[2]+"日 "+txt+ userName+ "</b></font> ";

chatPanel.mesTxt.htmlText = crazy;

}


for (var i:uint=1; i<=5; i++)

{

if (myTime[i] < 10)

{

myTime[i] = String(0 + String(myTime[i]));

}

}

var isTime = myTime[3] + ":" + myTime[4] + ":" + myTime[5];

return isTime;

}

}

}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章