区分TcpClient和WebSocket?

时间:2014-09-25 07:28:59

标签: sockets c#-4.0 websocket client-server

我正在开发一个应用程序,其中我使用socket进行服务器应用程序和客户端应用程序之间的通信(web和桌面)。
我的服务器应用程序不断监听客户端应用程序的请求并随时接受请求谈到。
服务器代码:

TcpListener listener = new TcpListener(IPAddress.Parse(ipAddStr), portNum);
listener.Start();
while (listen)
{
    TcpClient handler = listener.AcceptTcpClient();
    // doing some stuff
    // for every client handler i am creating a new thread and start listening for the next request
}

对于Web客户端我正在使用WebSocket,至于与WebSocket客户端建立连接,我们必须遵循一些握手过程。为此,我使用以下代码(工作正常):

    static private string guid = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
    private static string AcceptKey(ref string key)
    {
        string longKey = key + guid;
        SHA1 sha1 = SHA1CryptoServiceProvider.Create();
        byte[] hashBytes = sha1.ComputeHash(System.Text.Encoding.ASCII.GetBytes(longKey));
        return Convert.ToBase64String(hashBytes);
    }

使用websocket客户端生成和发送握手响应:

       // generate accept key fromm client header request
        var key = headerRequest.Replace("ey:", "`")
                         .Split('`')[1]                     
                         .Replace("\r", "").Split('\n')[0]  
                         .Trim();
        var responseKey = AcceptKey(ref key);

        //create the response for the webclient
        var newLine = "\r\n";
        var response = "HTTP/1.1 101 Switching Protocols" + newLine
                     + "Upgrade: websocket" + newLine
                     + "Connection: Upgrade" + newLine
                     + "Sec-WebSocket-Accept: " + responseKey + newLine + newLine;

        //send respose to the webclient
        Byte[] sendBytes = Encoding.ASCII.GetBytes(response);
        networkStream.Write(sendBytes, 0, sendBytes.Length);
        networkStream.Flush();

我还有用于桌面应用程序的TcpClient套接字,所以问题是如何识别请求来自WebSocket或来自TcpClient

2 个答案:

答案 0 :(得分:1)

最简单的方法是使用websocket侦听器和vanilla TCP侦听器侦听不同的端口号。无论如何,您应该这样做,因为websocket应用程序通常在标准http端口80(或使用带有TLS的websockets的标准https端口443)上运行,而基于TCP的自定义协议应该在"注册"的其中一个端口上运行我们建议您遵循这一要求,因为一个安全性良好的客户端环境允许用户进行Web访问而不是其他许多用户可能不允许用户连接到80和443以外的其他端口,而任何非http这些端口上的流量可能会触发入侵检测系统。

如果由于某种原因仍想在同一端口上处理这两种协议,那将会有点困难。 Websocket是一种基于TCP的协议,它首先看起来像一个vanilla HTTP GET请求,直到您收到标题Connection: UpgradeUpgrade: websocket

这意味着首先需要同一个侦听器接受任一协议的连接请求。只有在客户端发送了足够的数据来识别其连接尝试作为您的自定义协议或websocket(或者与您的端口意外连接的完全不同的东西 - 当您部署面向Internet的应用程序时会遇到很多)然后委派与客户端通信到适当的处理程序类。

答案 1 :(得分:1)

TcpClient是一个Socket包装器。

WebSocket是一种可以在TcpClient上运行的协议。 WebSocket协议定义握手以及如何构建数据。

区分简单TCP连接和WebSocket连接的最佳方法是让它们在不同的端口中侦听,因为您将使用不同的协议。如果你把它们放在同一个端口就好了,它会变得一团糟。