html5 websocket ping,C# HTML5 Websocket Server

I'm trying to create a C# Websocket server but I just don't seem to get it working.

I now have a server that accepts the TCPClient, receives the HTTP request from the client and that tries to send back a HTTP response so the HTML5 WebSocket handshake can be completed.

I believe there is something wrong with my handshake that the server sends to the client.

I read the draft (Websocket 76 draft) which states that at the end of the handshake a response has to be given for the two keys that are given. This response gets calculated by the server.

This is my code:

static void Main(string[] args)

{

int port = 8181;

IPAddress localAddr = IPAddress.Loopback;

TcpListener server = new TcpListener(localAddr, port);

server.Start();

// Buffer for reading data

Byte[] receivedBytes = new Byte[256];

String data = null;

// Enter the listening loop.

while (true)

{

Console.WriteLine("Waiting for a connection...");

// Perform a blocking call to accept requests.

// You could also user server.AcceptSocket() here.

TcpClient client = server.AcceptTcpClient();

Console.WriteLine("Connected!\n");

data = null;

// Get a stream object for reading and writing

NetworkStream stream = client.GetStream();

int i;

// Loop to receive all the data sent by the client.

while ((i = stream.Read(receivedBytes, 0, receivedBytes.Length)) != 0)

{

// Translate data bytes to a ASCII string.

data = System.Text.Encoding.UTF8.GetString(receivedBytes, 0, i);

Console.WriteLine("Received:");

Console.WriteLine(data);

Byte[] response_token = hashResponse(data);

string handshake = "HTTP/1.1 101 WebSocket Protocol Handshake\r\n"

+ "Upgrade: WebSocket\r\n" + "Connection: Upgrade\r\n"

+ "Sec-WebSocket-Origin: http://localhost\r\n"

+ "Sec-WebSocket-Location: ws://localhost:8181/websession\r\n"

+ "\r\n";

Byte[] writtenBytes = Encoding.UTF8.GetBytes(handshake);

stream.Write(writtenBytes, 0, writtenBytes.Length);

stream.Write(response_token, 0, response_token.Length);

Console.WriteLine("Send:");

Console.WriteLine(handshake);

string strHash = Encoding.UTF8.GetString(response_token);

Console.WriteLine(strHash);

}

}

}

static Byte[] hashResponse(string receivedData)

{

string strDel = "\r\n";

char[] delimeter = strDel.ToCharArray();

string Key1 = null;

string Key2 = null;

string hash = null;

MD5 md5 = MD5.Create();

string[] lines = receivedData.Split(delimeter);

Key1 = lines[10].Substring(20);

Key2 = lines[12].Substring(20);

hash = lines[16];

Int64 numbersKey1 = Convert.ToInt64(string.Join(null, Regex.Split(Key1, "[^\\d]")));

Int64 numbersKey2 = Convert.ToInt64(string.Join(null, Regex.Split(Key2, "[^\\d]")));

Int64 numberSpaces1 = countSpaces(Key1);

Int64 numberSpaces2 = countSpaces(Key2);

int dividedKey1 = (int) (numbersKey1 / numberSpaces1);

int dividedKey2 = (int) (numbersKey2 / numberSpaces2);

Byte[] encodedKey1 = Encoding.UTF8.GetBytes(dividedKey1.ToString());

Byte[] encodedKey2 = Encoding.UTF8.GetBytes(dividedKey2.ToString());

Byte[] encodedHash = Encoding.UTF8.GetBytes(hash);

Byte[] combined = Encoding.UTF8.GetBytes(dividedKey1.ToString() + dividedKey2.ToString() + hash);

Byte[] responseHash = md5.ComputeHash(combined);

return responseHash;

}

static int countSpaces(string key)

{

int counter = 0;

char[] charArray = key.ToCharArray();

foreach (char c in charArray)

{

if (c.Equals(' '))

counter++;

}

return counter;

}

The HTML page (which is named Test.html) I'm using for testing is hosted by an apache webserver which runs on my computer I access it by browsing (in Chrome) to http://localhost/Test.html

Does anyone have a clue what I'm doing wrong because I'm getting quite desperate.

Thanks in advance

Dennis

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值