如何在WebSocket中发送消息

时间:2013-11-19 07:44:03

标签: c# websocket

我拿了一个简单的WebSocket服务器,其中web-client发送消息(Hello Wordld),然后服务器响应客户端并发送Hello World“”。但我想从服务器获取数据,客户端将在网页上打印日期。我做错了什么?你能帮我吗

namespace WebSocket
 {
class Program
{
    static Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
    static private string guid = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";

    static void Main(string[] args)
    {
        serverSocket.Bind(new IPEndPoint(IPAddress.Any, 8080));
        serverSocket.Listen(128);
        serverSocket.BeginAccept(null, 0, OnAccept, null);
        Console.Read();
    }

    private static void OnAccept(IAsyncResult result)
    {
        byte[] buffer = new byte[1024];
        try
        {
            Socket client = null;
            string headerResponse = "";
            if (serverSocket != null && serverSocket.IsBound)
            {
                client = serverSocket.EndAccept(result);
                var i = client.Receive(buffer);
                headerResponse = (System.Text.Encoding.UTF8.GetString(buffer)).Substring(0, i);
                // write received data to the console
                Console.WriteLine(headerResponse);

            }
            if (client != null)
            {
                /* Handshaking and managing ClientSocket */

                var key = headerResponse.Replace("ey:", "`")
                          .Split('`')[1]                     // dGhlIHNhbXBsZSBub25jZQ== \r\n .......
                          .Replace("\r", "").Split('\n')[0]  // dGhlIHNhbXBsZSBub25jZQ==
                          .Trim();

                // key should now equal dGhlIHNhbXBsZSBub25jZQ==
                var test1 = AcceptKey(ref key);

                var newLine = "\r\n";

                var response = "HTTP/1.1 101 Switching Protocols" + newLine
                     + "Upgrade: websocket" + newLine
                     + "Connection: Upgrade" + newLine
                     + "Sec-WebSocket-Accept: " + test1 + newLine + newLine
                    //+ "Sec-WebSocket-Protocol: chat, superchat" + newLine
                    //+ "Sec-WebSocket-Version: 13" + newLine
                     ;

                // which one should I use? none of them fires the onopen method
                client.Send(System.Text.Encoding.UTF8.GetBytes(response));

                var i = client.Receive(buffer); // wait for client to send a message

                // once the message is received decode it in different formats
                Console.WriteLine(Convert.ToBase64String(buffer).Substring(0, i));

                Console.WriteLine("\n\nPress enter to send data to client");
                Console.Read();

                var time = DateTime.Now.ToString();

                int length = time.Length;

                var Data = Encoding.UTF8.GetBytes(time);

                buffer = Data;


                var subA = SubArray<byte>(buffer, 0, length);
                client.Send(subA);
                Thread.Sleep(10000);//wait for message to be send


            }
        }
        catch (SocketException exception)
        {
            throw exception;
        }
        finally
        {
            if (serverSocket != null && serverSocket.IsBound)
            {
                serverSocket.BeginAccept(null, 0, OnAccept, null);
            }
        }
    }

    public static T[] SubArray<T>(T[] data, int index, int length)
    {
        T[] result = new T[length];
        Array.Copy(data, index, result, 0, length);
        return result;
    }

    private static string AcceptKey(ref string key)
    {
        string longKey = key + guid;
        byte[] hashBytes = ComputeHash(longKey);
        return Convert.ToBase64String(hashBytes);
    }

    static SHA1 sha1 = SHA1CryptoServiceProvider.Create();
    private static byte[] ComputeHash(string str)
    {
        return sha1.ComputeHash(System.Text.Encoding.ASCII.GetBytes(str));
    }
}

}

这是网络客户端

  <script type="text/JavaScript">
    function connect() {
        var ws = new WebSocket("ws://localhost:8080/service");
        ws.onopen = function () {
            alert("About to send data");
            ws.send("Hello World"); 
            alert("Message sent!");
        };

        ws.onmessage = function (evt) {
           // alert("About to receive data");
            var received_msg = evt.data;
            document.write("Message received = "+received_msg);
            // alert("Message received = "+received_msg);
        };
        ws.onclose = function () {
            // websocket is closed.
            alert("Connection is closed...");

        };
    };
</script>

例如,如果我将删除这句话

 var time = DateTime.Now.ToString();
 int length = time.Length;
 var Data = Encoding.UTF8.GetBytes(time);
  buffer = Data;

并更改

                var subA = SubArray<byte>(buffer, 0, length);

之后一切正常,但它只发送Hello World,但我想发送时间和日期。我怎么能这样做?请帮帮我

0 个答案:

没有答案