HTML5-WebSocket實現(xiàn)聊天室示例
在傳統(tǒng)的網(wǎng)頁實現(xiàn)聊天室的方法是通過每隔一段時間請求服務(wù)器獲取相關(guān)聊天信息來實現(xiàn),然而html5帶來的websocket功能改變這了這種方式.由于websocket在連接服務(wù)器后允許保持連接來進(jìn)行數(shù)據(jù)交互,因此服務(wù)器可以主動地向客戶端發(fā)送相應(yīng)的數(shù)據(jù).對于html5的處理只需要在連接創(chuàng)建完成后在websocket的receive事件中處理接收的數(shù)據(jù)即可.下面通過實現(xiàn)一個聊天室來體驗一下服務(wù)器可以主動地向客戶端發(fā)的功能.
功能
一個簡單的聊天室主要有以下幾個功能:
1)注冊
注冊要處理幾個事情,分別是注冊完成后獲取當(dāng)前服務(wù)器所有用戶列表,服務(wù)把當(dāng)前注冊成功的用戶發(fā)送給其他在線的用戶.
2)發(fā)信息
服務(wù)器把當(dāng)前接收的消息發(fā)送給在線的其他用戶
3)退出
服務(wù)器把斷開的用戶通知其他用戶
聊天室完成的功能預(yù)覽如下:

C#服務(wù)端代碼
服務(wù)端的代碼只需要針對幾功能定義幾個方法即可,分別是注冊,獲取其他用戶和發(fā)送信息.具體代碼如下:
/// <summary>
/// Copyright © henryfan 2012
///Email: henryfan@msn.com
///HomePage: http://www.ikende.com
///CreateTime: 2012/12/7 21:45:25
/// </summary>
class Handler
{
public long Register(string name)
{
TcpChannel channel = MethodContext.Current.Channel;
Console.WriteLine("{0} register name:{1}", channel.EndPoint, name);
channel.Name = name;
JsonMessage msg = new JsonMessage();
User user = new User();
user.Name = name;
user.ID = channel.ClientID;
user.IP = channel.EndPoint.ToString();
channel.Tag = user;
msg.type = "register";
msg.data = user;
foreach (TcpChannel item in channel.Server.GetOnlines())
{
if (item != channel)
item.Send(msg);
}
return channel.ClientID;
}
public IList<User> List()
{
TcpChannel channel = MethodContext.Current.Channel;
IList<User> result = new List<User>();
foreach (TcpChannel item in channel.Server.GetOnlines())
{
if (item != channel)
result.Add((User)item.Tag);
}
return result;
}
public void Say(string Content)
{
TcpChannel channel = MethodContext.Current.Channel;
JsonMessage msg = new JsonMessage();
SayText st = new SayText();
st.Name = channel.Name;
st.ID = channel.ClientID;
st.Date = DateTime.Now;
st.Content = Content;
st.IP = channel.EndPoint.ToString();
msg.type = "say";
msg.data = st;
foreach (TcpChannel item in channel.Server.GetOnlines())
{
item.Send(msg);
}
}
}
只需要以上簡單的代碼就完成了聊天室服務(wù)端的功能,對于用戶退出可以通過連接釋放事件來做處理具體代碼:
protected override void OnDisposed(object sender, ChannelDisposedEventArgs e)
{
base.OnDisposed(sender, e);
Console.WriteLine("{0} disposed", e.Channel.EndPoint);
JsonMessage msg = new JsonMessage();
User user = new User();
user.Name = e.Channel.Name;
user.ID = e.Channel.ClientID;
user.IP = e.Channel.EndPoint.ToString();
msg.type = "unregister";
msg.data = (User)e.Channel.Tag;
foreach (TcpChannel item in this.Server.GetOnlines())
{
if (item != e.Channel)
item.Send(msg);
}
}
這樣聊天定的服務(wù)端代碼就已經(jīng)完成了.
JavaScript代碼
對于html5代碼首先要做的一件事就是連接到服務(wù)器,相關(guān)javascript代碼如下:
function connect() {
channel = new TcpChannel();
channel.Connected = function (evt) {
callRegister.parameters.name = $('#nikename').val();
channel.Send(callRegister, function (result) {
if (result.status == null || result.status == undefined) {
$('#dlgConnect').dialog('close');
registerid = result.data;
list();
}
});
};
channel.Disposed = function (evt) {
$('#dlgConnect').dialog('open');
};
channel.Error = function (evt) {
alert(evt);
};
channel.Receive = function (result) {
if (result.type == "register") {
var item = getUser(result.data);
$(item).appendTo($('#lstOnlines'));
}
else if (result.type == 'unregister') {
$('#user_' + result.data.ID).remove();
}
else if (result.type == 'say') {
addSayItem(result.data);
}
else {
}
}
channel.Connect($('#host').val());
}
通過Receive回調(diào)池數(shù)來處理不同消息的情況,如果是接收到其他用戶的注冊信息,則把用戶信息添加到列表中;如果收到的其他用戶的退出信息則在用戶列表種移走;直接收到消息添加到消息顯示框中即可.有jquery的幫助以上事件都變得非常簡單.
用戶注冊調(diào)用過程:
var callRegister = { url: 'Handler.Register', parameters: { name: ''} };
function register() {
$('#frmRegister').form('submit', {
onSubmit: function () {
var isValid = $(this).form('validate');
if (isValid) {
connect();
}
return false;
}
});
}
獲取在線用戶列表過程:
var callList = { url: 'Handler.List', parameters: {} };
function list() {
channel.Send(callList, function (result) {
$('#lstOnlines').html('');
for (var i = 0; i < result.data.length; i++) {
var item = getUser(result.data[i]);
$(item).appendTo($('#lstOnlines'));
}
});
}
發(fā)送消息過程:
var callSay = { url: 'Handler.Say', parameters: {Content:""} }
function Say() {
callSay.parameters.Content = mEditor.html();
mEditor.html('');
channel.Send(callSay);
$('#content1')[0].focus();
}
代碼下載:demo
總結(jié)
經(jīng)過代碼封裝后websocket的處理變得非常簡單,如果你有興趣完全可以在此代碼上擴(kuò)展出一個更多功能的聊到室,如聊天室分組,發(fā)送信息圖片共享等等.
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
HTML5+WebSocket實現(xiàn)多文件同時上傳的實例
本篇文章主要介紹了HTML5-WebSocket實現(xiàn)多文件同時上傳的實例,HTML5結(jié)合Websocket進(jìn)行文件的傳輸就變得更加方便和靈活,有興趣的可以了解一下。2016-12-29- 這篇文章主要介紹了淺析HTML5的WebSocket與服務(wù)器推送事件,WebSocket API最大的特點就是讓服務(wù)器和客戶端能在給定的時間范圍內(nèi)的任意時刻,相互推送信息,需要的朋友可以參2016-02-19
HTML5實現(xiàn)WebSocket協(xié)議原理淺析
這篇文章主要為大家介紹了HTML5實現(xiàn)WebSocket協(xié)議原理,可以幫助初學(xué)者理解WebSocket協(xié)議,需要的朋友可以參考下2014-07-07html5的websockets全雙工通信詳解學(xué)習(xí)示例
本文主要研究HTML5 WebSockets的使用方法,它是HTML5中最強大的通信功能,定義了一個全雙工的通信信道,只需Web上的一個Socket即可進(jìn)行通信,能減少不必要的網(wǎng)絡(luò)流量并降低2014-02-26利用html5的websocket實現(xiàn)websocket聊天室
利用html5的websocket實現(xiàn)一個聊天室,大家可以參考使用2013-12-12html5-websocket基于遠(yuǎn)程方法調(diào)用的數(shù)據(jù)交互實現(xiàn)
一般在傳統(tǒng)網(wǎng)頁中注冊用戶信息都是通過post或ajax提交到頁面處理,到了HTML5后我們有另一種方法就是通過websocket進(jìn)行數(shù)據(jù)交互,接下來將詳細(xì)介紹,需要了解的朋友可以參考下2012-12-04- 這篇文章主要介紹了基于HTML5的WebSocket的實例代碼,需要的朋友可以參考下2018-08-15

