如何取消服务器的响应?

时间:2014-04-10 13:11:51

标签: java sockets websocket

这是我的代码

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();
  }
}

我正在制作聊天应用程序并从服务器获得响应。首先,服务器正在向连接到它的所有客户端发送响应。但现在我将其转换为一对一的基于客户端的聊天,但问题是如果john正在聊天与mary这些值放在数据库中,我只能在加载页面时通过scriplet从数据库中获取数据,所以当用户想与dave聊天时如何实现它。然后我无法从中获取值数据库中。

3 个答案:

答案 0 :(得分:2)

我完全明白你想自己写这个,但是有很多框架可以帮助你处理复杂的事情,让你专注于解决实际的业务问题。

我们大多数时候都使用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(用于通过websockets发布订阅)
  • 安装jQuery(因为我很懒)
  • 安装Momoent.JS(用于在javascript中使用日期工作)
  • 安装knockoutjs(用于模型绑定)
  • 在App_Start中添加了一个XSockets引导程序(在Add-&gt; NewItem-&gt; XSockets-&gt; XSockets.Web.Bootstrapper
  • 下找到

答案 1 :(得分:1)

我想你只需要为你的程序添加控制功能: 添加两个列表框和两个用于选择发件人,接收者(search_id,log_id)的按钮

List <string> logins=new List<string>();
List <string> search=new List<string>();
 ........

logins.Add("John");
logins.Add("Mary");
.....
search.Add("Dave");
listBox1.Datasource=logins;
listBox2.Datasource=search;

private void button1_Click(object sender, EventArgs e) //pick login_id
        {
            login_id_to_Compare=listBox1.SelectedValue.ToString();
        }

private void button2_Click(object sender, EventArgs e) //pick searcid
        {
            searchid_to_Compare=listBox2.SelectedValue.ToString();
        }


function sendMessage()
{
 if(textMessage.value!=="close")
  {
    if((searchid===searchid_to_Compare) && (login_id===login_id_to_Compare))
       {
        webSocket.send(textMessage.value);
        textMessage.value="";
       }
   }
  else
  {         
   webSocket.close();
  }
}

答案 2 :(得分:1)

您的发送消息似乎过于简单了。服务器没有足够的信息将消息路由到正确的目的地。

您需要将消息与目的地一起发送,以便您的服务器可以将消息路由到正确的用户。

在您的数据库中,您可以将&#34;保存到&#34; &#34;来自&#34;并仅为相关各方显示正确的信息。

您当然必须将字段添加到聊天程序中以选择目的地。

function sendMessage(from, to, msg)
{
    webSocket.send("{'from':" + from + ", 'to':" + to + ", 'msg': " + msg + "}");
}