【发布时间】:2014-09-25 07:28:59
【问题描述】:
我正在开发一个应用程序,其中我使用套接字在服务器应用程序和客户端应用程序(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?
【问题讨论】:
标签: sockets c#-4.0 websocket client-server