<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>荒巻オンライン3 本拠地 &#187; クソコード</title>
	<atom:link href="http://scaltinof.net/?feed=rss2&#038;tag=%e3%82%af%e3%82%bd%e3%82%b3%e3%83%bc%e3%83%89" rel="self" type="application/rss+xml" />
	<link>http://scaltinof.net</link>
	<description>荒巻スカルチノフのP2Pでオープンソースなアバターチャット　荒巻オンライン3のプロジェクトWebページです。</description>
	<lastBuildDate>Sun, 11 Oct 2009 17:15:19 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>開発記録 2009/02/19</title>
		<link>http://scaltinof.net/?p=152</link>
		<comments>http://scaltinof.net/?p=152#comments</comments>
		<pubDate>Thu, 19 Feb 2009 15:12:43 +0000</pubDate>
		<dc:creator>スーパーバッカー</dc:creator>
				<category><![CDATA[荒巻オンライン3]]></category>
		<category><![CDATA[ver3.00β4]]></category>
		<category><![CDATA[クソコード]]></category>
		<category><![CDATA[本体]]></category>

		<guid isPermaLink="false">http://backeros.if.land.to/aramaki_blog/?p=152</guid>
		<description><![CDATA[開発記録

Peerクラスほぼ完成

(記事のタイトルをクリックでPeerクラスを表示)

package jp.sourceforge.aramaki.net {
	import flash.events.EventDispatcher;
	import flash.events.NetStatusEvent;
	import flash.net.NetConnection;
	import flash.net.NetStream;
	import jp.sourceforge.aramaki.events.PeerChangeGroupEvent;
	import jp.sourceforge.aramaki.events.PeerEvent;
	import jp.sourceforge.aramaki.events.PeerMessageEvent;
	/**
	 * ピア接続完了イベント
	 *
	 * @eventType jp.sourceforge.aramaki.events.PeerEvent.PEER_CONNECT
	 */
	[Event(name=&#38;quot;peerConnect&#38;quot;,type=&#38;quot;jp.sourceforge.aramaki.events.PeerEvent&#38;quot;)]
	/**
	 * グループ変更イベント
	 *
	 * @eventType jp.sourceforge.aramaki.events.PeerChangeGroupEvent.PEER_CHANGE_GROUP
	 */
	[Event(name=&#38;quot;peerChangeGroup&#38;quot;,type=&#38;quot;jp.sourceforge.aramaki.events.PeerChangeGroupEvent&#38;quot;)]
	/**
	 * メッセージ受信イベント
	 *
	 * @eventType jp.sourceforge.aramaki.events.PeerMessageEvent.PEER_MESSAGE
	 */
	[Event(name=&#38;quot;peerMessage&#38;quot;,type=&#38;quot;jp.sourceforge.aramaki.events.PeerMessageEvent&#38;quot;)]
	public class Peer extends EventDispatcher {
		/**
		 * 出力ストリーム
		 */
		private var outgoingStream:NetStream;
		/**
		 * 入力ストリーム
		 */
		private var incomingStream:NetStream;
		/**
		 * @private
		 */
		private var _id:String;
		/**
		 * StratusへのNetConnection
		 */
		private var [...]]]></description>
			<content:encoded><![CDATA[<h2>開発記録</h2>
<ul>
<li>Peerクラスほぼ完成</li>
</ul>
<p>(記事のタイトルをクリックでPeerクラスを表示)<br />
<span id="more-152"></span></p>
<p>package jp.sourceforge.aramaki.net {<br />
	import flash.events.EventDispatcher;<br />
	import flash.events.NetStatusEvent;<br />
	import flash.net.NetConnection;<br />
	import flash.net.NetStream;</p>
<p>	import jp.sourceforge.aramaki.events.PeerChangeGroupEvent;<br />
	import jp.sourceforge.aramaki.events.PeerEvent;<br />
	import jp.sourceforge.aramaki.events.PeerMessageEvent;</p>
<p>	/**<br />
	 * ピア接続完了イベント<br />
	 *<br />
	 * @eventType jp.sourceforge.aramaki.events.PeerEvent.PEER_CONNECT<br />
	 */<br />
	[Event(name=&amp;quot;peerConnect&amp;quot;,type=&amp;quot;jp.sourceforge.aramaki.events.PeerEvent&amp;quot;)]<br />
	/**<br />
	 * グループ変更イベント<br />
	 *<br />
	 * @eventType jp.sourceforge.aramaki.events.PeerChangeGroupEvent.PEER_CHANGE_GROUP<br />
	 */<br />
	[Event(name=&amp;quot;peerChangeGroup&amp;quot;,type=&amp;quot;jp.sourceforge.aramaki.events.PeerChangeGroupEvent&amp;quot;)]<br />
	/**<br />
	 * メッセージ受信イベント<br />
	 *<br />
	 * @eventType jp.sourceforge.aramaki.events.PeerMessageEvent.PEER_MESSAGE<br />
	 */<br />
	[Event(name=&amp;quot;peerMessage&amp;quot;,type=&amp;quot;jp.sourceforge.aramaki.events.PeerMessageEvent&amp;quot;)]</p>
<p>	public class Peer extends EventDispatcher {<br />
		/**<br />
		 * 出力ストリーム<br />
		 */<br />
		private var outgoingStream:NetStream;<br />
		/**<br />
		 * 入力ストリーム<br />
		 */<br />
		private var incomingStream:NetStream;<br />
		/**<br />
		 * @private<br />
		 */<br />
		private var _id:String;<br />
		/**<br />
		 * StratusへのNetConnection<br />
		 */<br />
		private var netConnection:NetConnection;<br />
		/**<br />
		 * @private<br />
		 */<br />
		private var _connected:Boolean=false;<br />
		/**<br />
		 * @private<br />
		 */<br />
		private var _group:String=&amp;quot;&amp;quot;;<br />
		/**<br />
		 * 入力ストリーム準備完了フラグ<br />
		 */<br />
		private var incomingStreamReady:Boolean;</p>
<p>		/**<br />
		 * ピアへ接続<br />
		 *<br />
		 * @param netConnection Stratusへ接続したNetConnection<br />
		 * @param id 接続先ピアのID<br />
		 */<br />
		public function connect(netConnection:NetConnection,id:String):void {<br />
			_id=id;<br />
			this.netConnection=netConnection;</p>
<p>			doConnect();<br />
		}</p>
<p>		/**<br />
		 * ピアへ接続<br />
		 */<br />
		private function doConnect():void {<br />
			incomingStreamReady=false;</p>
<p>			netConnection.addEventListener(NetStatusEvent.NET_STATUS,netConnectionNetStatusHandler);</p>
<p>			outgoingStream=new NetStream(netConnection,NetStream.DIRECT_CONNECTIONS);<br />
			outgoingStream.addEventListener(NetStatusEvent.NET_STATUS,outgoingStreamNetStatusHandler);<br />
			outgoingStream.publish(_id);</p>
<p>			incomingStream=new NetStream(netConnection,_id);<br />
			incomingStream.client={message:peerMessageHandler,changeGroup:peerChangeGroupHandler};<br />
			incomingStream.addEventListener(NetStatusEvent.NET_STATUS,incomingStreamNetStatusHandler);<br />
			incomingStream.play(netConnection.nearID);<br />
		}</p>
<p>		/**<br />
		 * 入力ストリームのNetStatusEventハンドラ<br />
		 */<br />
		private function incomingStreamNetStatusHandler(event:NetStatusEvent):void {<br />
			switch(event.info.code) {<br />
				case &amp;quot;NetStream.Play.Start&amp;quot;: {<br />
					if (!_connected) {<br />
						if (outgoingStream.peerStreams.length) {<br />
							//出力ストリームの準備が完了<br />
							//接続完了<br />
							_connected=true;<br />
							dispatchEvent(new PeerEvent(PeerEvent.PEER_CONNECT,false,false,this));<br />
						} else {<br />
							incomingStreamReady=true;<br />
						}<br />
					}</p>
<p>					break;<br />
				}<br />
			}<br />
		}</p>
<p>		/**<br />
		 * 出力ストリームのNetStatusEventハンドラ<br />
		 */<br />
		private function outgoingStreamNetStatusHandler(event:NetStatusEvent):void {<br />
			switch(event.info.code) {<br />
				case &amp;quot;NetStream.Play.Start&amp;quot;: {<br />
					if ((!_connected)&amp;amp;&amp;amp;incomingStreamReady) {<br />
						//接続完了<br />
						_connected=true;<br />
						dispatchEvent(new PeerEvent(PeerEvent.PEER_CONNECT,false,false,this));<br />
					}</p>
<p>					break;<br />
				}<br />
			}<br />
		}</p>
<p>		/**<br />
		 * NetConnectionのNetStatusEventハンドラ<br />
		 */<br />
		private function netConnectionNetStatusHandler(event:NetStatusEvent):void {<br />
			switch(event.info.code) {<br />
				case &amp;quot;NetStream.Connect.Failed&amp;quot;:<br />
				case &amp;quot;NetStream.Connect.Closed&amp;quot;: {<br />
					if (event.info.stream.farID==_id&amp;amp;&amp;amp;_connected) {<br />
						_connected=false;</p>
<p>						netConnection.removeEventListener(NetStatusEvent.NET_STATUS,netConnectionNetStatusHandler);</p>
<p>						outgoingStream.removeEventListener(NetStatusEvent.NET_STATUS,outgoingStreamNetStatusHandler);<br />
						outgoingStream.close();<br />
						outgoingStream=null;</p>
<p>						incomingStream.removeEventListener(NetStatusEvent.NET_STATUS,incomingStreamNetStatusHandler);<br />
						incomingStream.close();<br />
						incomingStream=null;</p>
<p>						doConnect();<br />
					}<br />
					break;<br />
				}<br />
			}<br />
		}</p>
<p>		/**<br />
		 * メッセージを受信<br />
		 */<br />
		private function peerMessageHandler(handlerName:String,args:Array):void {<br />
			dispatchEvent(new PeerMessageEvent(PeerMessageEvent.PEER_MESSAGE,false,false,this,handlerName,args));<br />
		}</p>
<p>		/**<br />
		 * グループ変更<br />
		 */<br />
		private function peerChangeGroupHandler(group:String):void {<br />
			_group=group;<br />
			dispatchEvent(new PeerChangeGroupEvent(PeerChangeGroupEvent.PEER_CHANGE_GROUP,false,false,this,group));<br />
		}</p>
<p>		/**<br />
		 * メッセージを送信<br />
		 *<br />
		 * @param handlerName ハンドラの名前<br />
		 */<br />
		public function send(handlerName:String,&#8230;args):void {<br />
			outgoingStream.send(&amp;quot;message&amp;quot;,handlerName,args);<br />
		}</p>
<p>		/**<br />
		 * グループの変更を通知<br />
		 */<br />
		internal function notifyChangeGroup(group:String):void {<br />
			outgoingStream.send(&amp;quot;changeGroup&amp;quot;,group);<br />
		}</p>
<p>		/**<br />
		 * 接続中フラグ<br />
		 */<br />
		public function get connected():Boolean {<br />
			return _connected;<br />
		}</p>
<p>		/**<br />
		 * 所属グループ<br />
		 */<br />
		public function get group():String {<br />
			return _group;<br />
		}</p>
<p>		/**<br />
		 * 接続を閉じる<br />
		 */<br />
		public function close():void {<br />
			_connected=false;</p>
<p>			netConnection.removeEventListener(NetStatusEvent.NET_STATUS,netConnectionNetStatusHandler);<br />
			netConnection.close();<br />
			netConnection=null;</p>
<p>			outgoingStream.removeEventListener(NetStatusEvent.NET_STATUS,outgoingStreamNetStatusHandler);<br />
			outgoingStream.close();<br />
			outgoingStream=null;</p>
<p>			incomingStream.removeEventListener(NetStatusEvent.NET_STATUS,incomingStreamNetStatusHandler);<br />
			incomingStream.close();<br />
			incomingStream=null;<br />
		}<br />
	}<br />
}</p>
]]></content:encoded>
			<wfw:commentRss>http://scaltinof.net/?feed=rss2&amp;p=152</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>開発記録 2009/02/18</title>
		<link>http://scaltinof.net/?p=143</link>
		<comments>http://scaltinof.net/?p=143#comments</comments>
		<pubDate>Wed, 18 Feb 2009 15:10:18 +0000</pubDate>
		<dc:creator>スーパーバッカー</dc:creator>
				<category><![CDATA[荒巻オンライン3]]></category>
		<category><![CDATA[ver3.00β4]]></category>
		<category><![CDATA[クソコード]]></category>
		<category><![CDATA[本体]]></category>

		<guid isPermaLink="false">http://backeros.if.land.to/aramaki_blog/?p=143</guid>
		<description><![CDATA[開発記録

ネットワーク周りの構造を変更中
Flex SDKを3.3へアップデート

↓記事のタイトルをクリックするとNetwork.as,Peer.asを表示

Network.as
/*
	AramakiOnline
	Copyright (C) 2008-2009 superbacker
	This program is free software; you can redistribute it and/or modify it under the terms
	of the GNU General Public License as published by the Free Software Foundation;
	either version 3 of the License, or (at your option) any later version.
	This program is distributed in the hope that it will be useful, but [...]]]></description>
			<content:encoded><![CDATA[<h2>開発記録</h2>
<ul>
<li>ネットワーク周りの構造を変更中</li>
<li>Flex SDKを3.3へアップデート</li>
</ul>
<p>↓記事のタイトルをクリックするとNetwork.as,Peer.asを表示<br />
<span id="more-143"></span><br />
Network.as</p>
<p>/*<br />
	AramakiOnline<br />
	Copyright (C) 2008-2009 superbacker</p>
<p>	This program is free software; you can redistribute it and/or modify it under the terms<br />
	of the GNU General Public License as published by the Free Software Foundation;<br />
	either version 3 of the License, or (at your option) any later version.</p>
<p>	This program is distributed in the hope that it will be useful, but WITHOUT ANY<br />
	WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS<br />
	FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.</p>
<p>	You should have received a copy of the GNU General Public License along with this<br />
	program. If not, see &lt;http://www.gnu.org/licenses/&gt;.<br />
*/</p>
<p>package jp.sourceforge.aramaki.net {<br />
	import flash.events.ErrorEvent;<br />
	import flash.events.Event;<br />
	import flash.events.EventDispatcher;<br />
	import flash.events.NetStatusEvent;<br />
	import flash.net.NetConnection;<br />
	import flash.net.NetStream;</p>
<p>	import jp.sourceforge.aramaki.events.PeerChangeGroupEvent;<br />
	import jp.sourceforge.aramaki.events.PeerEvent;<br />
	import jp.sourceforge.aramaki.events.PeerIdEvent;<br />
	import jp.sourceforge.aramaki.events.PeerMessageEvent;</p>
<p>	/**<br />
	 * 接続イベント<br />
	 * @eventType flash.events.Event.CONNECT<br />
	 */<br />
	[Event(name=&quot;connect&quot;,type=&quot;flash.events.Event&quot;)]</p>
<p>	/**<br />
	 * 接続失敗イベント<br />
	 * @eventType flash.events.ErrorEvent.ERROR<br />
	 */<br />
	[Event(name=&quot;error&quot;,type=&quot;flash.events.ErrorEvent&quot;)]</p>
<p>	/**<br />
	 * 切断イベント<br />
	 * @eventType flash.events.Event.CLOSE<br />
	 */<br />
	[Event(name=&quot;close&quot;,type=&quot;flash.events.Event&quot;)]</p>
<p>	/**<br />
	 * グループが変更されたときに呼ばれる<br />
	 * @eventType jp.sourceforge.aramaki.events.PeerChangeGroupEvent.PEER_CHANGE_GROUP<br />
	 */<br />
	[Event(name=&quot;peerChangeGroup&quot;,type=&quot;jp.sourceforge.aramaki.events.PeerChangeGroupEvent&quot;)]</p>
<p>	/**<br />
	 * ピア接続イベント<br />
	 * @eventType jp.sourceforge.aramaki.events.PeerEvent.CONNECT<br />
	 */<br />
	[Event(name=&quot;peerConnect&quot;,type=&quot;jp.sourceforge.aramaki.events.PeerEvent&quot;)]</p>
<p>	/**<br />
	 * ピア切断イベント<br />
	 * @eventType jp.sourceforge.aramaki.events.PeerEvent.CLOSE<br />
	 */<br />
	[Event(name=&quot;peerClose&quot;,type=&quot;jp.sourceforge.aramaki.events.PeerEvent&quot;)]</p>
<p>	/**<br />
	 * ネットワーククラス<br />
	 */<br />
	public class Network extends EventDispatcher {<br />
		/**<br />
		 * デベロッパーキー<br />
		 */<br />
		private const DEVELOPPER_KEY:String = &quot;6ea6f12c8cca3fc6293596f3-1724aff91113&quot;;<br />
		/**<br />
		 * Adobe Stratusへの接続用NetConnection<br />
		 */<br />
		private var netConnection:NetConnection;<br />
		/**<br />
		 * メッセージを受信したときコールバックメソッドが呼び出されるオブジェクト<br />
		 */<br />
		public var client:Object={};<br />
		/**<br />
		 * @private<br />
		 */<br />
		private var _group:String=&quot;__default_group__&quot;;<br />
		/**<br />
		 * ピア管理クラス<br />
		 */<br />
		private var peerManager:PeerManager;<br />
		/**<br />
		 * @private<br />
		 */<br />
		private var _peers:Object={};</p>
<p>		/**<br />
		 * 自身が属するグループ<br />
		 *<br />
		 * @default &quot;__default_group__&quot;<br />
		 */<br />
		public function get group():String {<br />
			return _group;<br />
		}</p>
<p>		/**<br />
		 * @private<br />
		 */<br />
		public function set group(value:String):void {<br />
			_group=value;</p>
<p>			for each(var peer:Peer in _peers) {<br />
				peer.notifySendGroup(value);<br />
			}<br />
		}</p>
<p>		/**<br />
		 * ピア<br />
		 */<br />
		public function get peers():Object {<br />
			return _peers;<br />
		}</p>
<p>		/**<br />
		 * ネットワークへ接続<br />
		 *<br />
		 * netConnectionを作成しStratusへ接続<br />
		 */<br />
		public function connect():void {<br />
			netConnection=new NetConnection;<br />
			netConnection.maxPeerConnections=0xffff;<br />
			netConnection.addEventListener(NetStatusEvent.NET_STATUS,netConnectionNetStatusHandler);<br />
			netConnection.connect(&quot;rtmfp://stratus.adobe.com/&quot;+DEVELOPPER_KEY);<br />
		}</p>
<p>		/**<br />
		 * NetConnectionのNetStatusEventハンドラ<br />
		 */<br />
		private function netConnectionNetStatusHandler(event:NetStatusEvent):void {<br />
			trace(&quot;Network: NetConnection:&quot;+event.info.code);</p>
<p>			switch(event.info.code) {<br />
				case &quot;NetConnection.Connect.Success&quot;: {<br />
					//Stratusへ接続完了<br />
					peerManager=new PeerManager;<br />
					peerManager.addEventListener(Event.CONNECT,dispatchEvent);<br />
					peerManager.addEventListener(Event.CLOSE,peerManagerCloseHandler);<br />
					peerManager.addEventListener(ErrorEvent.ERROR,peerManagerConnectFailedHandler);<br />
					peerManager.addEventListener(PeerIdEvent.PEER_CONNECT,peerManagerPeerConnectHandler);<br />
					peerManager.addEventListener(PeerIdEvent.PEER_CLOSE,peerManagerPeerCloseHandler);<br />
					peerManager.connect(netConnection.nearID);</p>
<p>					break;<br />
				}<br />
				case &quot;NetConnection.Connect.Failed&quot;: {<br />
					//Stratusへの接続に失敗<br />
					dispose();</p>
<p>					dispatchEvent(new ErrorEvent(ErrorEvent.ERROR,false,false,&quot;Stratusへの接続に失敗しました。&quot;));</p>
<p>					break;<br />
				}<br />
				case &quot;NetConnection.Connect.Closed&quot;: {<br />
					//Startusから切断<br />
					dispose();</p>
<p>					dispatchEvent(new Event(Event.CLOSE));</p>
<p>					break;<br />
				}<br />
			}<br />
		}</p>
<p>		/**<br />
		 * ピア管理サーバーへの接続に失敗<br />
		 */<br />
		private function peerManagerConnectFailedHandler(event:ErrorEvent):void {<br />
			dispose();</p>
<p>			dispatchEvent(event);<br />
		}</p>
<p>		/**<br />
		 * ピア管理サーバーから切断<br />
		 */<br />
		private function peerManagerCloseHandler(event:Event):void {<br />
			close();<br />
		}</p>
<p>		/**<br />
		 * ピアへの接続要求<br />
		 */<br />
		private function peerManagerPeerConnectHandler(event:PeerIdEvent):void {<br />
			var peer:Peer=new Peer;<br />
			peer.connect(event.id);<br />
			_peers[event.id]=peer;<br />
		}</p>
<p>		/**<br />
		 * ピアが切断<br />
		 */<br />
		private function peerManagerPeerCloseHandler(event:PeerIdEvent):void {<br />
			_peers[event.id].close();<br />
			delete _peers[event.id];<br />
		}</p>
<p>		/**<br />
		 * 後始末<br />
		 */<br />
		private function dispose():void {<br />
			if (peerManager) {<br />
				peerManager.removeEventListener(Event.CONNECT,peerManagerConnectHandler);<br />
				peerManager.removeEventListener(Event.CLOSE,peerManagerCloseHandler);<br />
				peerManager.removeEventListener(ErrorEvent.ERROR,peerManagerConnectFailedHandler);<br />
				peerManager.removeEventListener(PeerIdEvent.PEER_CONNECT,peerManagerPeerConnectHandler);<br />
				peerManager.removeEventListener(PeerIdEvent.PEER_CLOSE,peerManagerPeerCloseHandler);<br />
				peerManager.close();<br />
			}</p>
<p>			if (listenerStream) {<br />
				listenerStream.close();<br />
				listenerStream=null;<br />
			}</p>
<p>			if (netConnection) {<br />
				netConnection.removeEventListener(NetStatusEvent.NET_STATUS,netConnectionNetStatusHandler);<br />
				netConnection.close();<br />
				netConnection=null;<br />
			}<br />
		}</p>
<p>		/**<br />
		 * メッセージを受信<br />
		 * コールバックオブジェクトのメソッドを呼び出す<br />
		 */<br />
		private function peerMessageHandler(event:PeerMessageEvent):void {<br />
			var args:Array=event.args;<br />
			args.unshift(event.peer);<br />
			client[event.handlerName].apply(null,args);<br />
		}</p>
<p>		/**<br />
		 * 接続を閉じる<br />
		 */<br />
		public function close():void {<br />
			dispose();</p>
<p>			dispatchEvent(new Event(Event.CLOSE));<br />
		}</p>
<p>		/**<br />
		 * すべてのピアへメッセージを送信<br />
		 * @param handlerName ハンドラの名前<br />
		 * @param args ハンドラの引数<br />
		 */<br />
		public function sendToAll(handlerName:String,&#8230;args):void {<br />
			args.unshift(handlerName);</p>
<p>			for each(var peer:Peer in _peers) {<br />
				peer.send.apply(null,args);<br />
			}<br />
		}</p>
<p>		/**<br />
		 * 同じグループのピアへメッセージを送信<br />
		 * @param handlerName ハンドラの名前<br />
		 * @param args ハンドラの引数<br />
		 */<br />
		public function sendToGroup(handlerName:String,&#8230;args):void {<br />
			args.unshift(handlerName);</p>
<p>			for each(var peer:Peer in _peers) {<br />
				if (peer.group==_group) peer.send.apply(null,args);<br />
			}<br />
		}<br />
	}<br />
}</p>
<p>Peer.as</p>
<p>package jp.sourceforge.aramaki.net {<br />
	import flash.events.EventDispatcher;<br />
	import flash.net.NetConnection;<br />
	import flash.net.NetStream;</p>
<p>	/**<br />
	 * ピア接続完了イベント<br />
	 *<br />
	 * @eventType jp.sourceforge.aramaki.events.PeerEvent.PEER_CONNECT<br />
	 */<br />
	[Event(name=&quot;peerConnect&quot;,type=&quot;jp.sourceforge.aramaki.events.PeerEvent&quot;)]<br />
	/**<br />
	 * ピア切断イベント<br />
	 *<br />
	 * @eventType jp.sourceforge.aramaki.events.PeerEvent.PEER_CLOSE<br />
	 */<br />
	[Event(name=&quot;peerClose&quot;,type=&quot;jp.sourceforge.aramaki.events.PeerEvent&quot;)]<br />
	/**<br />
	 * グループ変更イベント<br />
	 *<br />
	 * @eventType jp.sourceforge.aramaki.events.PeerChangeGroupEvent.PEER_CHANGE_GROUP<br />
	 */<br />
	[Event(name=&quot;peerChangeGroup&quot;,type=&quot;jp.sourceforge.aramaki.events.PeerChangeGroupEvent&quot;)]<br />
	/**<br />
	 * メッセージ受信イベント<br />
	 *<br />
	 * @eventType jp.sourceforge.aramaki.events.PeerMessageEvent.PEER_MESSAGE<br />
	 */<br />
	[Event(name=&quot;peerMessage&quot;,type=&quot;jp.sourceforge.aramaki.events.PeerMessageEvent&quot;)]</p>
<p>	public class Peer extends EventDispatcher {<br />
		/**<br />
		 * @private<br />
		 */<br />
		private var _outgoingStream:NetStream;<br />
		/**<br />
		 * @private<br />
		 */<br />
		private var _incomingStream:NetStream;<br />
		/**<br />
		 * @private<br />
		 */<br />
		private var _id:String;<br />
		/**<br />
		 * StratusへのNetConnection<br />
		 */<br />
		private var _netConnection:NetConnection;<br />
		/**<br />
		 * @private<br />
		 */<br />
		private var _state:int=STATE_NOT_CONNECTED;<br />
		/**<br />
		 * 未接続<br />
		 */<br />
		private const STATE_NOT_CONNECTED:int=0;<br />
		/**<br />
		 * 接続処理中<br />
		 */<br />
		private const STATE_CONNECTING:int=1;<br />
		/**<br />
		 * 接続中<br />
		 */<br />
		private const STATE_CONNECTED:int=2;</p>
<p>		/**<br />
		 * ピアへ接続<br />
		 *<br />
		 * @param netConnection Stratusへ接続したNetConnection<br />
		 * @param id 接続先ピアのID<br />
		 */<br />
		public function connect(netConnection:NetConnection,id:String):void {<br />
			_id=id;<br />
			_netConnection=netConnection;<br />
			_state=STATE_CONNECTING;</p>
<p>			_incomingStream=new NetStream(netConnection,id);<br />
			_incomingStream.client={message:peerMessageHandler,changeGroup:peerChangeGroup};<br />
		}</p>
<p>		/**<br />
		 * メッセージを送信<br />
		 *<br />
		 * @param handlerName ハンドラの名前<br />
		 */<br />
		public function send(handlerName:String,&#8230;args):void {<br />
			_outgoingStream.send(&quot;message&quot;,handlerName,args);<br />
		}</p>
<p>		/**<br />
		 * 出力ストリーム<br />
		 */<br />
		public function get outgoingStream():NetStream {<br />
			return _outgoingStream;<br />
		}</p>
<p>		/**<br />
		 * 入力ストリーム<br />
		 */<br />
		public function get incomingStream():NetStream {<br />
			return _incomingStream;<br />
		}<br />
	}<br />
}</p>
]]></content:encoded>
			<wfw:commentRss>http://scaltinof.net/?feed=rss2&amp;p=143</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ギッコネットのパスワード紛失した</title>
		<link>http://scaltinof.net/?p=782</link>
		<comments>http://scaltinof.net/?p=782#comments</comments>
		<pubDate>Wed, 21 Jan 2009 14:02:50 +0000</pubDate>
		<dc:creator>スーパーバッカー</dc:creator>
				<category><![CDATA[荒巻オンライン3]]></category>
		<category><![CDATA[ver3.00β4]]></category>
		<category><![CDATA[クソコード]]></category>
		<category><![CDATA[本体]]></category>

		<guid isPermaLink="false">http://backeros.if.land.to/aramaki_blog/?p=27</guid>
		<description><![CDATA[
パスワードを忘れてギッコネットにログインできねえ／(^o^)＼
ネットワーク周りを作り直し中

今日書いたコード:
Network.as
(ここから先は省略。記事のタイトルをクリックすると読めます。)
 作りかけ
pa [...]]]></description>
			<content:encoded><![CDATA[<ul>
<li>パスワードを忘れてギッコネットにログインできねえ／(^o^)＼</li>
<li>ネットワーク周りを作り直し中</li>
</ul>
<p>今日書いたコード:<br />
Network.as</p>
<p>(ここから先は省略。記事のタイトルをクリックすると読めます。)<br />
<span id="more-782"></span> <strong>作りかけ</strong></p>
<p>package {<br />
import __AS3__.vec.Vector;</p>
<p>import flash.events.Event;<br />
import flash.events.EventDispatcher;<br />
import flash.events.NetStatusEvent;<br />
import flash.net.NetConnection;<br />
import flash.net.NetStream;</p>
<p>/**<br />
* 接続成功イベント<br />
*/<br />
[Event(name=&amp;quot;connectComplete&amp;quot;,type=&amp;quot;flash.events.Event&amp;quot;)]</p>
<p>/**<br />
* 接続失敗イベント<br />
*/<br />
[Event(name=&amp;quot;connectFailed&amp;quot;,type=&amp;quot;flash.events.Event&amp;quot;)]</p>
<p>/**<br />
* 切断イベント<br />
*/<br />
[Event(name=&amp;quot;connectClosing&amp;quot;,type=&amp;quot;flash.events.Event&amp;quot;)]</p>
<p>/**<br />
* 切断完了イベント<br />
*/<br />
[Event(name=&amp;quot;connectClosed&amp;quot;,type=&amp;quot;flash.events.Event&amp;quot;)]</p>
<p>/**<br />
* ネットワーククラス<br />
*/<br />
public class Network extends EventDispatcher {<br />
/**<br />
* デベロッパーキー<br />
*/<br />
private const DEVELOPPER_KEY:String = &amp;quot;6ea6f12c8cca3fc6293596f3-1724aff91113&amp;quot;;<br />
/**<br />
* @private<br />
*/<br />
private var _netConnection:NetConnection;<br />
/**<br />
* 出力ストリーム<br />
*/<br />
private var outgoingStream:NetStream;<br />
/**<br />
* 入力ストリームの配列<br />
*/<br />
private var incomingSterams:Vector.&amp;lt;netStream&amp;gt;;<br />
/**<br />
* @private<br />
*/<br />
private var _group:String;<br />
/**<br />
* @private<br />
*/<br />
private var _client:Object;<br />
/**<br />
* 初期ピア管理クラス<br />
*/<br />
private var initPeerManager:InitPeerManager;</p>
<p>/**<br />
* Adobe Stratusへの接続用NetConnection<br />
*/<br />
public function get netConnection():NetConnection {<br />
return _netConnection;<br />
}</p>
<p>/**<br />
* 自分が属するグループ<br />
*/<br />
public function get group():String {<br />
return _group;<br />
}</p>
<p>/**<br />
* @private<br />
*/<br />
public function set group(value:String):void {<br />
_group=value;<br />
//TODO 更新<br />
}</p>
<p>/**<br />
* コールバックメソッドが呼び出されるオブジェクト<br />
*/<br />
public function get client():Object {<br />
return _client;<br />
}</p>
<p>/**<br />
* ネットワークへ接続<br />
*/<br />
public function connect():void {<br />
_netConnection=new NetConnection;<br />
_netConnection.addEventListener(NetStatusEvent.NET_STATUS,netConnectionNetStatusHandler);<br />
_netConnection.connect(&amp;quot;rtmfp://stratus.adobe.com/&amp;quot;+DEVELOPPER_KEY);<br />
}</p>
<p>/**<br />
* NetConnectionのNetStatusEventハンドラ<br />
*/<br />
private function netConnectionNetStatusHandler(event:NetStatusEvent):void {<br />
trace(&amp;quot;Network: NetConnection:&amp;quot;+event);</p>
<p>switch(event.info.code) {<br />
//接続に成功<br />
case &amp;quot;NetConnection.Connect.Success&amp;quot;: {<br />
outgoingStream=new NetStream(netConnection,NetStream.DIRECT_CONNECTIONS);<br />
outgoingStream.client={onPeerConnect:onPeerConnect};<br />
outgoingStream.addEventListener(NetStatusEvent.NET_STATUS,outgoingStreamNetStatusHandler);<br />
outgoingStream.publish(&amp;quot;chat&amp;quot;);</p>
<p>initPeerManager=new InitPeerManager;<br />
initPeerManager.id=_netConnection.nearID;<br />
initPeerManager.register();</p>
<p>break;<br />
}<br />
//接続に失敗<br />
case &amp;quot;NetConnection.Connect.Failed&amp;quot;: {<br />
_netConnection=null;<br />
dispatchEvent(new Event(&amp;quot;connectFailed&amp;quot;));<br />
break;<br />
}<br />
//切断<br />
case &amp;quot;NetConnection.Connect.Closed&amp;quot;: {<br />
break;<br />
}<br />
//ピアへの接続に成功<br />
case &amp;quot;NetStream.Connect.Success&amp;quot;: {<br />
break;<br />
}<br />
//ピアへの接続に失敗<br />
case &amp;quot;NetStream.Connect.Failed&amp;quot;: {<br />
break;<br />
}<br />
//ピアが切断<br />
case &amp;quot;NetStream.Connect.Closed&amp;quot;: {<br />
break;<br />
}<br />
}<br />
}</p>
<p>/**<br />
* 出力ストリームのNetStatusEventハンドラ<br />
*/<br />
private function outgoingStreamNetStatusEventHandler(event:NetStatusEvent):void {<br />
trace(&amp;quot;Network: outgoingStream: &amp;quot;+event.toString());<br />
}</p>
<p>/**<br />
* ピアが出力ストリームに接続してきたときに呼ばれる<br />
* @param subscriber ピアへの出力ストリーム<br />
* @return trueで接続許可 falseで接続拒否<br />
*/<br />
private function onPeerConnect(subscriber:NetStream):Boolean {<br />
for each(var stream:NetStream in incomingSterams) {<br />
//受信ストリームがすでに作成されているかチェック<br />
if (stream.farID==subscriber.farID) {<br />
//接続完了<br />
//TODO: dispatchEvent();</p>
<p>return true;<br />
}<br />
}</p>
<p>return true;<br />
}</p>
<p>/**<br />
* すべてのピアへメッセージを送信<br />
* @param handlerName ハンドラの名前<br />
* @param args 引数<br />
*/<br />
public function sendToAll(handlerName:String,&#8230;args):void {<br />
args.unshift(handlerName);<br />
outgoingStream.send.apply(outgoingStream,args);<br />
}</p>
<p>/**<br />
* 同じグループのピアへメッセージを送信<br />
* @param handlerName ハンドラの名前<br />
* @param args 引数<br />
*/<br />
public function sendToGroup(handlerName:String,&#8230;args):void {<br />
args.unshift(handlerName);</p>
<p>for each(var stream:NetStream in outgoingStream.peerStreams) {<br />
//TODO:実装<br />
//if (_group==stream.client.group) {<br />
}<br />
}</p>
<p>/**<br />
* 指定されたIDのピアへメッセージを送信<br />
* @param peerId 送り先のピアのID<br />
* @param handlerName ハンドラの名前<br />
* @param args 引数<br />
*/<br />
public function sendToPeer(peerId:String,handlerName:String,&#8230;args):void {<br />
args.unshift(handlerName);</p>
<p>for each(var stream:NetStream in outgoingStream.peerStreams) {<br />
if (stream.farID==peerId) {<br />
stream.send.apply(stream,args);<br />
return;<br />
}<br />
}<br />
}<br />
}<br />
}</p>
]]></content:encoded>
			<wfw:commentRss>http://scaltinof.net/?feed=rss2&amp;p=782</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
