html5-websocket基于遠(yuǎn)程方法調(diào)用的數(shù)據(jù)交互實(shí)現(xiàn)

一般在傳統(tǒng)網(wǎng)頁(yè)中注冊(cè)用戶信息都是通過(guò)post或ajax提交到頁(yè)面處理,到了HTML5后我們有另一種方法就是通過(guò)websocket進(jìn)行數(shù)據(jù)交互.websocket在數(shù)據(jù)交互有著傳統(tǒng)網(wǎng)頁(yè)所不具備的靈活性,通過(guò)Websocket建立長(zhǎng)連接后服務(wù)器可以直接向client發(fā)送數(shù)據(jù),而每次數(shù)據(jù)交互沒(méi)有必要帶上大量的http頭信息.websocket協(xié)議本身支持兩種數(shù)據(jù)格式文本和流,通過(guò)文本json的方式和javascript交互是一件非常簡(jiǎn)單事情,通過(guò)json網(wǎng)頁(yè)和Websocket通訊就非常便利,但要達(dá)到這個(gè)便利性我們還是要做簡(jiǎn)單的一些包裝還好現(xiàn)有的json在各平臺(tái)的組件都比較成熟.通過(guò)分析json數(shù)據(jù)映射到服務(wù)端對(duì)應(yīng)的方法執(zhí)行處理.
下面通過(guò)一個(gè)簡(jiǎn)單的用戶注冊(cè)來(lái)體現(xiàn)html5用josn和websocket進(jìn)行交互的處理過(guò)程.由于經(jīng)過(guò)封裝處理所以使用起來(lái)非常方便.
HTML:功能很簡(jiǎn)單就是連接到websocket服務(wù)后進(jìn)行注冊(cè)信息提交,當(dāng)然為了更靈活點(diǎn)我們?cè)诒O(jiān)測(cè)到連接關(guān)閉的時(shí)候重新打開(kāi)連接窗體,具體的JS代碼如下:
function connect() {
channel = new TcpChannel();
channel.Connected = function (evt) {
$('#dlgConnect').dialog('close');
};
channel.Disposed = function (evt) {
$('#dlgConnect').dialog('open');
};
channel.Error = function (evt) {
alert(evt);
};
channel.Connect($('#txtHost').val());
}
代碼是不是很簡(jiǎn)潔,主要原因是在WebSocket的基礎(chǔ)上封裝了一個(gè)TcpChannel,詳細(xì)代碼可以下載了解.連接成功后就進(jìn)入了注冊(cè)窗體
通過(guò)填寫一些注冊(cè)信息后,點(diǎn)擊注冊(cè)把信息通過(guò)WebSocket提交給服務(wù)端,相關(guān)提交的JS代碼如下:
var invokeregister = { url: 'Handler.OnRegister', parameters: { UserName: '', Email: '', PassWord: ''} };
function register() {
$('#frmRegister').form('submit', {
onSubmit: function () {
var isValid = $(this).form('validate');
if (isValid) {
invokeregister.parameters = $('#frmRegister').serializeObject();
channel.Send(invokeregister, function (result) {
alert(result.data);
});
}
return false;
}
});
}
當(dāng)驗(yàn)證數(shù)據(jù)成功后通過(guò)TcpChannel發(fā)送一個(gè)方法調(diào)用描述對(duì)象即可,url是指定調(diào)用的類方法,而paramters即是方法的參數(shù),參數(shù)也可以是復(fù)雜的結(jié)構(gòu)類型.第二個(gè)參數(shù)是一個(gè)回調(diào)處理. C#
服務(wù)由于基于Beetle的擴(kuò)展處理,所以代碼是非常簡(jiǎn)單的.針對(duì)以上注冊(cè)的邏輯方法代碼如下:
public class Handler
{
public string OnRegister(string UserName, string Email, string PassWord)
{
Console.WriteLine(UserName);
Console.WriteLine(Email);
Console.WriteLine(PassWord);
return UserName;
}
}
方法只需要定義相關(guān)參數(shù)即可,Beetle的消息擴(kuò)展控制器會(huì)自動(dòng)分析js提交的json數(shù)據(jù)進(jìn)行分析并綁定到相關(guān)方法中執(zhí)行.對(duì)于控制器的詳細(xì)代碼也可以通過(guò)下載代得到.邏輯編寫完成我們只需要簡(jiǎn)單地打開(kāi)相關(guān)websocket服務(wù)即可.
{
static void Main(string[] args)
{
Beetle.Controllers.Controller.Register(new Handler());
TcpUtils.Setup("beetle");
Program server = new Program();
server.Open(8088);
Console.WriteLine("websocket start@8088");
System.Threading.Thread.Sleep(-1);
}
protected override void OnError(object sender, ChannelErrorEventArgs e)
{
base.OnError(sender, e);
Console.WriteLine(e.Exception.Message);
}
protected override void OnConnected(object sender, ChannelEventArgs e)
{
base.OnConnected(sender, e);
Console.WriteLine("{0} connected", e.Channel.EndPoint);
}
protected override void OnDisposed(object sender, ChannelDisposedEventArgs e)
{
base.OnDisposed(sender, e);
Console.WriteLine("{0} disposed", e.Channel.EndPoint);
}
}
WebSocket.Server.rar (641.79 kb)
相關(guān)文章
HTML5+WebSocket實(shí)現(xiàn)多文件同時(shí)上傳的實(shí)例
本篇文章主要介紹了HTML5-WebSocket實(shí)現(xiàn)多文件同時(shí)上傳的實(shí)例,HTML5結(jié)合Websocket進(jìn)行文件的傳輸就變得更加方便和靈活,有興趣的可以了解一下。2016-12-29HTML5-WebSocket實(shí)現(xiàn)聊天室示例
本篇文章主要介紹了HTML5-WebSocket實(shí)現(xiàn)聊天室示例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2016-12-15- 這篇文章主要介紹了淺析HTML5的WebSocket與服務(wù)器推送事件,WebSocket API最大的特點(diǎn)就是讓服務(wù)器和客戶端能在給定的時(shí)間范圍內(nèi)的任意時(shí)刻,相互推送信息,需要的朋友可以參2016-02-19
HTML5實(shí)現(xiàn)WebSocket協(xié)議原理淺析
這篇文章主要為大家介紹了HTML5實(shí)現(xiàn)WebSocket協(xié)議原理,可以幫助初學(xué)者理解WebSocket協(xié)議,需要的朋友可以參考下2014-07-07html5的websockets全雙工通信詳解學(xué)習(xí)示例
本文主要研究HTML5 WebSockets的使用方法,它是HTML5中最強(qiáng)大的通信功能,定義了一個(gè)全雙工的通信信道,只需Web上的一個(gè)Socket即可進(jìn)行通信,能減少不必要的網(wǎng)絡(luò)流量并降低2014-02-26利用html5的websocket實(shí)現(xiàn)websocket聊天室
利用html5的websocket實(shí)現(xiàn)一個(gè)聊天室,大家可以參考使用2013-12-12- 這篇文章主要介紹了基于HTML5的WebSocket的實(shí)例代碼,需要的朋友可以參考下2018-08-15