2011年12月4日 星期日

[PHP] PHP 的多人聊天 Socket 伺服器


恩~為了幫我的 prueMVC 的作測試!
尋找多種不同 伺服器端是很重要的!
這次的目標是 Socket 伺服器

恩~不過這個有很多的問題~

第一個
遇上的就是 PHP 不支援的部分~
首先看 php 的 info
如果
Sockets Support enabled
這樣就 OK了~如果沒有
那請到 php.ini
去修改 extension=php_sockets.dll 把這個的# 用掉
這樣就可以成功的寫出 PHP的程式了

第二個
就是執行的問題
根據 因為是伺服器的關係~
不太建議大家使用 網頁去開~
特別是沒改限制時間的
比較建議使用 命令列的方式去開

像我在這會遇上一個問題就是
php_exif.dll 會說有問題 (或是 沒找到)
基本上~你只要修改一下順序就可以了
把 extension=php_exif.dll 移到
extension=php_mbstring.dll 的後面
重開一次 伺服器~
就可以正常執行了

3. 程式的部分!
因為我PHP只會一點點~
所以這邊 99% 都是照抄的
這個網站教PHP Socket 的部分我覺得蠻詳細的
一開始我都是照這個去建構~
基本上 只要照作範例是跑得起來的
不過會遇上防火牆的問題

4.
如果遇上防火牆的問題
這邊就是需要你把防火牆打開

怎樣判斷是否式防火牆的問題!
如果你 網址 PORT都設定正確~
伺服器也跑起來了
但是 你使用 CLIENT 沒有出現任何的回應
在你伺服器端的畫面上
那應該是防火牆的問題~

記得按照你寫的PROT 和 TCP UCP去開~
而且要開兩個~一個傳出 一個傳入~

5.
一個多人架構的 PHP 伺服器
PHP+Flex实现多人聊天(berrywu寫的)
他的這個 伺服器只能在 DEBUG的情況下使用
當然是以WEB的FLASH來說~
用AIR也是可以正常執行~不過要雙開有點麻煩~
然後這個在ADOBE中有一個範例 是解決安全性問題的SOCKET的策略
不過不記得網址了

我修改 (berrywu的) 伺服器 只要在他的
function readFromSocket( $clientId ){
中加入一段就可以解決
基本加完的結果如下


function readFromSocket( $clientId ){
   // start with empty string
   $data   = "";
   // 新增安全規則的部分!
   $buf2 = socket_read( $this->clientFD[$clientId], $this->readBufferSize );
   if(strpos($buf2,'policy-file-request')){
    $msg ="<cross-domain-policy><allow-access-from domain='*' to-ports='*' /></cross-domain-policy>";
socket_write($this->clientFD[$clientId], $msg."\0", strlen($msg."\0"));
}
   // read data from socket
   while( $buf = socket_read( $this->clientFD[$clientId], $this->readBufferSize ) ){
    $data .= $buf;

    $endString = substr( $buf, - strlen( $this->readEndCharacter ) );
    if( $endString == $this->readEndCharacter )
     break;
    if( $buf == NULL )
     break;
   }
   if( $buf === false ) $this->sendDebugMessage( "Could not read from client2 ".$clientId." ( ".$this->getLastSocketError( $this->clientFD[$clientId] )." )." );
   return $data;
}


好了到此算是完全結束~
當然你也可以使用 (berrywu的) 範例做一下試驗!
不過我等等來看看 zend 有沒有這方面的東東~
忘了一開始使就去查 orz

2011年12月3日 星期六

[AS3] zendAmf + PureMVC + flex 4.5的聊天室

先來來 看看效果巴
聊天室的原碼


這個放在空間上的是 單機板的!
所以不是即時的可以多人聊天版
我的改法是錯誤示範把 Proxy 中的 Delegate 的通通停掉
然後直接傳出事件
其實應該寫另外一個 Delegate 來作單機的
而不是像現在的方式~
直接寫在 Proxy 中!

然後我來講一下這個裡面我遇上的一些問題!

1. 中文問題
很久以前FLEX MX版的textInput有問題~
後來修正了~現在 S版的 textInput
也是一樣有中文的問題~
所以我打算找 MX的INPUT和S版的對照改
看看能不能解決~
但是我覺得這兩個 相差太多 我照改改出一些問題~
所以最後又改回 MX版的 不過這樣做有不少的問題~
MX和S版的 參數有差~本身對 RICHTEXT有差~~
基本上~我遇過 input的中文輸入問題 大概就下面這幾個
 a . 因為 HTML上的鑲入語法沒設成 windows 或是  transparent
 b. input有沒有 focus~沒有焦點不能換成中文輸入
 c. 沒有設 IME.enabled = true;
 d. 組件使用 s版的
這邊我是使用 MX版的組件~
配合HTML設成 windows  來解決這個問題

2.文字框置底問題
以前都是使用MX版的組件~
設置置底很簡單~都使用verticalScrollPosition
現在使用 S版的沒有這個屬性變得很麻煩
而且 S版的 textArea的組件 要設 verticalScrollPosition 和 verticalCenter 屬性~
使用 appendText 區增加文字~
會自動置底~
我是過直接將 文字給 組件的方式
但是這個方式不會置底喔

後來置換 SKIN的時候! 又遇上了置底的問題~
建議是換了後 過一小段時間
在執行appendText 就會置底了

3. 文字格式的問題
這個範例中 可以簡單的設 5種不同的屬性
大小 顏色 粗細 斜體 底線
恩~因為MX沒有 textFlow這個屬性..
最後看 官方文件 才知道怎樣做
我選擇的是 Creating a TextFlow object in ActionScript 的方法~
如果沒看到這個 我想我的做法應該還是回去老方式
使用 htmlText的方法去做~

4.換SKIN的方法~
本來我是想使用CSS的方式~或是換MC元件的方式
後來想到之前 Ticore 大大教的方法 (之前我要換官方的Alert的SKIN 不會換~)
所以就使用 MXML SKIN的方式去做~
基本上我設計不太行 所以我就基本的改了幾個屬性看看效果
像是 button 的部分我只有改框線的顏色
textArea 的部分 我就加了背景
如果仔細研究一下應該是可以加更多的地方
還有支援這樣換的 只有S版的 不過可能是因為介面的關係~
說不定仔細的GOOGLE一下 說不定可以找到兼容MX版的方式
我覺得兩個應該不會相差太大!

5. 表情符號的部分~雖然我有看到範例!
但是我沒辦法傳回 主機端處理在使用!
最重要原因是 一次傳輸裡面可以有多個表情符號!
傳到伺服器是沒問題!
但是伺服器的記錄和在使用的部分就麻煩了
最主要是我不想在建一個表然後JOIN
但是這邊我還沒想到好的方法~
基本上應該是存成文字檔 存進資料庫
然後 讀出來在解析成 ARRAY然後傳回去的方式
傳回的文字串和圖片位置的問題
而且這一塊 我是想要獨立出來 自己成一個 VIEW的方式去處理!

6. PHP 處理數據的問題~
本來想使用remote的方式可以減低PHP的連線數的
不過看起來好像是沒啥幫助!
不過也可能是SQL寫的太爛的關係
我在本機端測 1秒鐘 更新一次資料
兩個人同時連的情況~我的電腦 CPU 就會吃到100%...
就是因為這個原因~
讓我不敢放在主機上這種自動更新的即時機置