这是我的代码
function sendMessage()
{
if(textMessage.value!=="close")
{
if(searchid==="John" && login_id==="Mary" || searchid==="Mary" && login_id==="John")
{
webSocket.send(textMessage.value);
textMessage.value="";
}
}
else
{
webSocket.close();
}
}
我正在创建一个聊天应用程序并从服务器获取响应。首先服务器正在向与之连接的所有客户端发送响应,但是现在我将其转换为一对一的基于客户端的聊天,但是问题是如果约翰正在与玛丽这些聊天值放置在数据库中,加载页面时,我只能一次通过scriplet从数据库中获取数据,因此当用户要与dave聊天时如何实现它。那么我无法从数据库中获取值。
最佳答案
我完全理解您想自己写这篇文章,但是有很多框架可以帮助您处理复杂的问题,并让您专注于要解决的实际业务问题。
我们大多数时候都使用XSockets.NET,因为它非常适合我们的需求。
使用XSockets进行一对一聊天(或其他情况)非常容易,因为这完全是发布/订阅...。您还可以使用强大的扩展方法来过滤在服务器上向何处发送消息。
一个简单的示例聊天:
为了节省时间并使它变得愚蠢而简单,我将使用两个下拉菜单,在其中选择您的姓名和所在的城市。实际上不是1-1,但是这样您就可以理解这个概念。
JAVASCRIPT / MARKUP
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<script src="Scripts/jquery-2.1.0.js"></script>
<script src="Scripts/moment.js"></script>
<script src="Scripts/XSockets.latest.js"></script>
<script src="Scripts/knockout-3.1.0.js"></script>
<script>
//viewmodel for our messages
var vm = {
messages : ko.observableArray([])
}
//xsockets connection
var conn;
$(function() {
ko.applyBindings(vm);
//Connect to our controller (Chat)
conn = new XSockets.WebSocket('ws://127.0.0.1:4502/Chat');
conn.onopen = function() {
//open, set city and username (for demo only)
conn.setProperty("UserName", $('#username').val());
conn.setProperty("City", $('#cities').val());
//listen for chatmesages
conn.on('chatmessage', function (d) {
//Add message to viewmodel
vm.messages.push(d);
});
}
//When we hit enter, send a message
$('input').on('keydown', function (e) {
if (e.keyCode == 13) {
//Build message, we do not need to set From since the server know who I am
var message = { Text: $(this).val(), Time: moment().format('MMMM Do YYYY, h:mm:ss a') };
conn.publish('chatmessage', message);
}
});
//When City or Username is changed, tell the server
$('#cities').on('change', function(d) {
conn.setProperty("City", $(this).val());
});
$('#username').on('change', function (d) {
conn.setProperty("UserName", $(this).val());
});
});
</script>
</head>
<body>
<input type="text" placeholder="type here, enter to send"/>
<select id="username">
<option value="steve">steve</option>
<option value="ben">ben</option>
<option value="tomas">tomas</option>
</select>
<select id="cities">
<option value="london">london</option>
<option value="paris">paris</option>
<option value="tokyo">tokyo</option>
</select>
<div data-bind="foreach:messages">
<h5 data-bind="text:From + ' - ' + Time"></h5>
<div data-bind="text:Text"></div>
</div>
</body>
</html>
C#
using XSockets.Core.XSocket;
using XSockets.Core.XSocket.Helpers;
namespace SimpleChat
{
public class ChatMessage
{
public string From { get; set; }
public string Text { get; set; }
public string Time { get; set; }
}
public class Chat : XSocketController
{
/// <summary>
/// My name, we set this from javascript...
/// </summary>
public string UserName { get; set; }
/// <summary>
/// We only send to people being in the same city, we set it from javascript
/// </summary>
public string City { get; set; }
/// <summary>
/// A user sends a message
/// </summary>
/// <param name="chatMessage"></param>
public void ChatMessage(ChatMessage chatMessage)
{
chatMessage.From = this.UserName;
//Send only to the client(s) being in the same city, but you can ofcourse change ot to another user only etc
this.SendTo(p => p.City == this.City, chatMessage,"chatmessage");
}
}
}
摘要
除了上面的代码,我唯一要做的就是创建一个新项目,然后
安装XSockets(以启动xsockets服务器)
安装XSockets.JsApi(用于通过websocket发布发布)
安装jQuery(因为我很懒)
安装Momoent.JS(适用于javascript中的日期)
安装淘汰表(用于模型绑定)
在App_Start中添加了一个XSockets引导程序(位于Add-> NewItem-> XSockets-> XSockets.Web.Bootstrapper下