Time of Update: 2018-12-06
erlang 開發平台很少,做JAVA開發的人做erlang開發,肯定會懷念eclipse中的快速鍵操作,配置調試,文法高亮等。Erlide則是這麼一款基於eclipse 的erlang開發外掛程式,目前的版本是0.13.9 安裝步驟如下: 1.安裝erlang開發環境(版本至少為R13B-5) 2.安裝eclipse
Time of Update: 2018-12-06
分析項目edownloader時看到的代碼: 從 “http://www.aaaa.com.cn/download/bbb/ccc.exe” 中截取ccc.exeuri.hrl-record(uri, {scheme, %% "http", "ftp" user_info="", %% [] | "srp" host="", %% "somewhere.net"
Time of Update: 2018-12-06
整了段代碼,想用mnesia資料庫來實作類別似於Oracle中sequence 的功能。原代碼如下:%% Author: Administrator%% Created: 2012-2-16%% Description: TODO: Add description to id_generator-module(id_generator).-behavior(gen_server).%%%% Include files%%%%%% Exported
Time of Update: 2018-12-06
兩個方法都可以用來啟動一個gen_server伺服器處理序,具體的參數如下: gen_server:start_link(Module,Args,Option); gen_server:start_link(ServerName,Module,Args,Option); 第二個方法只比第一個多了個ServerName,在gen_server的源碼中區別如下:start_link(Mod,
Time of Update: 2018-12-06
接著上一篇Erlang 聊天室程式(一) 。用戶端退出會導致伺服器端異常退出。 異常資訊如下:client sockt closed** exception exit: {bad_return_value,true} 顯然已經在client_session的 handle_info({tcp_closed,Socket},State)
Time of Update: 2018-12-06
霸哥的blog中提到過Erlang伺服器在通訊中與用戶端的資料交換方式:yufeng 為了簡單起見這個聊天室程式採用json,要使用到rfc4627這個庫 先定義一個Message類: public class Message {String id; //訊息IDString type; //訊息類型String from; //發送方String to; //接收方String subject;
Time of Update: 2018-12-06
同步、非同步、阻塞、非阻塞,涉及到一個問題的兩個層面。一個是操作operation/Thread/process 層面,另一個是kernal層面。所有的阻塞、非阻塞都在針對同步的情況下才有效。 同步與非同步最大區別在於是否需要底層的響應才能執行下去。 阻塞與非阻塞的區別在於是否能立即返迴響應。 一個比較形象的例子如下:
Time of Update: 2018-12-06
通過前面的erlang(1)我們瞭解到了一個基本的伺服器的實現方法。erlang中為我們提供了這樣一個伺服器的現成的實現,就是gen_server,不用自己去編寫伺服器程式了。所要做的就是以下幾個事:1.確定我們回調模組的名稱2.編寫介面函數3.實現六個回調方法也就是說我們只需要關注於回調模組的實現就OK了。1: -module(XXXX) 定義模組名稱2:介面函數,可供調用的函數。 在這裡你可以定義所有需要的方法,作為功能調用的入口。
Time of Update: 2018-12-06
用戶端登出分為正常離線和斷線,正常離線會發送presence 訊息通知伺服器,斷線則無通知發送。1. 正常離線:用戶端在離線之前發送<presence id='***' type ="unavailable"></presence>由PresenceRouter 路由到PresenceUpdateHandler 中處理。判斷Type為unavailable
Time of Update: 2018-12-06
用戶端在登入 Openfire 時都會收到自己訂閱的好友狀態,那麼這個好友狀態是怎麼下發下去的呢? 使用者在登入後會發送一個<presence> 來更新自己的狀態,在PresenceRouter 中進行處理。 這個presence 交由PresenceUpdateHandler 處理,在判斷使用者為註冊使用者後使用RosterManager.getRoster() 來擷取所有已經訂閱的其他使用者。針對每個使用者判斷關聯類型,如果為SUB_
Time of Update: 2018-12-06
為了學習C#繪圖,前段時間下了個對對碰的原碼看了下。發現原作者的代碼中有些地方不夠理想:沒有方塊的互換位置,方塊消失這兩個效果,操作起來顯得很生硬。於是自己把整個代碼重寫了一遍,包括進度條。 方塊的互換包括以下幾步: 1.當使用者按下左鍵時檢測所選擇的"起始方塊"。 2.當使用者鬆開左鍵時根據游標所在方向判斷要交換的"目標方塊"。 3.用Timer實現兩個方塊的位置交換效果,並完成相應後台資料位元置的交換。
Time of Update: 2018-12-06
ejabberd中由ejabberd_c2s處理:ejabberd_c2s模組啟動後gen_fsm的狀態位於wait_for_stream用戶端發送<stream:stream to="localhost" xmlns="jabber:client" xmlns:stream="http://etherx.jabber.org/streams" version="1.0">伺服器端wait_for_stream 函數中經過 case
Time of Update: 2018-12-06
Openfire 中多處用到了Cache 來儲存那些訪問較為頻繁的資料,例如userManager中的userCache,rosterManager 中的rosterCache。以下為Openfire中Cache的實現機制:1. Cache 介面:interface Cache<K,V> extends java.util.Map<K,V>提供了基本的Cache介面方法。2. Cacheable 介面:interface Cacheable extends
Time of Update: 2018-12-06
最近在搞Openfire S2S時遇到了一個資料通訊時的同步與非同步問題。具體描述如下: OF中的基本通訊結構如下: 用戶端與伺服器的通訊是同步的,伺服器與伺服器之間的通訊卻是非同步:用戶端發送一個請求後就會阻塞一段時間,等待伺服器的響應;伺服器之間則採用訊息通知的方式非同步交流資料。 所以會出現下面這種情況:
Time of Update: 2018-12-06
Openfire 開發環境搭建時容易出現Could not locate home 異常,主要由XMPPServer.java中以下代碼引起:private void initialize() FileNotFoundException{ locateOpenfire(); ......}private void locateOpenfire() throws FileNotFoundException{ String
Time of Update: 2018-12-06
之前的一篇文章中提到過OF中的同步非同步問題,這裡針對文章最後描述的兩個缺點做些改進。 這裡提供一個公用的專門用於處理S2S通訊問題的IQ類S2SDataManager。 可以提供多種介面:1.阻塞等待固定時間長度;2.阻塞等待,並在接收到結果或逾時後繼續;3.發送後直接返回;4.發送後直接返回,提供回調介面。 public class S2SDataManager implements
Time of Update: 2018-12-06
仍然看ejabberd_c2s 這個gen_fsm 模組。RECV <stream:stream to="localhost" xmlns="jabber:client" xmlns:stream="http://etherx.jabber.org/streams" version="1.0">SENT <?xml version='1.0' encoding='UTF-8'?><stream:stream
Time of Update: 2018-12-06
fqueue 是國內開發人員用JAVA開發的一款開源訊息佇列系統。訊息佇列可用來處理高並發量的資料庫讀寫操作,降低資料庫負載。fqueue的通訊層使用了netty架構,資料存放區則採用檔案隊列的方式。 儲存層主要的類有以下幾個: FQueue:主要的隊列實現主類,所有的訊息儲存與讀取都通過此類進行 FSQueue:FQueue的底層實現,
Time of Update: 2018-12-06
模組ejabberd_c2s中,狀態為session_established2。使用者發送iq set 訊息到伺服器<iq id="M8QF3-52" type="set"><query xmlns="jabber:iq:roster"><item jid="1555215557@kinglong"
Time of Update: 2018-12-06
上一篇blog分析了fqueue 的資料存放區層的實現。這篇主要分析通訊部分。fqueue使用jmemcached做為通訊層,jmemcached與用戶端的互動使用netty架構。 主要的類如下: startNewQueue:啟動類,每new一個instance 都會啟動一個監聽了相應連接埠的服務。