webscoket C#服务器端
websocket吧
全部回复
仅看楼主
level 1
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Security.Cryptography;
using System.IO;
namespace ConsoleService
{
class Program
{
static AutoResetEvent allDone = new AutoResetEvent(false);
static void Main(string[] args)
{
IPEndPoint localEP = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 40001);
Console.WriteLine("Local address and port : {0}", localEP.ToString());
Socket listener = new Socket(localEP.Address.AddressFamily,
SocketType.Stream, ProtocolType.Tcp);
try
{
listener.Bind(localEP);
listener.Listen(500);
while (true)
{
Socket sc = listener.Accept();
if (sc != null)
{
StateObject state = new StateObject();
state.workSocket = sc;
Console.WriteLine("Waiting for a connection...");
sc.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReceiveCallback), state);
allDone.WaitOne();
}
}
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
Console.WriteLine("Closing the listener...");
}
static void ReceiveCallback(IAsyncResult ar)
{
try
{
// Retrieve the state object and the client socket
// from the asynchronous state object.
StateObject state = (StateObject)ar.AsyncState;
Socket client = state.workSocket;
Console.WriteLine("接收自:" + state.workSocket.RemoteEndPoint.ToString());
// Read data from the remote device.
int bytesRead = client.EndReceive(ar);
allDone.Set();
if (bytesRead > 0)
{
System.Text.UTF8Encoding decoder = new System.Text.UTF8Encoding();
string browser = decoder.GetString(state.buffer, 0, bytesRead);
Console.WriteLine(browser);
string key = string.Empty;
Regex r = new Regex(@"Sec\-WebSocket\-Key:(.*?)\r\n"); //查找"Abc"
Match m = r.Match(browser); //设定要查找的字符串
if (m.Groups.Count != 0)
{
key = Regex.Replace(m.Value, @"Sec\-WebSocket\-Key:(.*?)\r\n", "$1").Trim();
}
Console.WriteLine("获取的客户端的KEY:" + key);
string secKeyAccept = Convert.ToBase64String(SHA1.Create().ComputeHash(Encoding.ASCII.GetBytes(key + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11")));
Console.WriteLine("服务器端生成的KEY:" + secKeyAccept);
var responseBuilder = new StringBuilder();
responseBuilder.Append("HTTP/1.1 101 Switching Protocols" + Environment.NewLine);
responseBuilder.Append("Upgrade: websocket" + Environment.NewLine);
responseBuilder.Append("Connection: Upgrade" + Environment.NewLine);
responseBuilder.Append("Sec-WebSocket-Accept: " + secKeyAccept + Environment.NewLine);
responseBuilder.Append("Sec-WebSocket-Protocol: chat" + Environment.NewLine );
responseBuilder.Append( Environment.NewLine);
Console.WriteLine("服务器端欲发送信息:\r\n" + responseBuilder.ToString());
byte[] HandshakeText = Encoding.UTF8.GetBytes(responseBuilder.ToString());
state.workSocket.BeginSend(HandshakeText, 0, HandshakeText.Length, 0, new AsyncCallback(SendCallback), state);
}
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
}
static void SendCallback(IAsyncResult ar)
{
StateObject state = (StateObject)ar.AsyncState;
Socket client = state.workSocket;
client.EndSend(ar);
Console.WriteLine("发送至:" + state.workSocket.RemoteEndPoint.ToString() + " 结束。");
Console.WriteLine("本应该握手成功的?!");
//byte[] msg = Encoding.UTF8.GetBytes("hello");
//state.workSocket.Send(msg);
}
}
public class StateObject
{
public Socket workSocket = null;
public const int BufferSize = 1024;
public byte[] buffer = new byte[BufferSize];
public StringBuilder sb = new StringBuilder();
}
}
我这个为什么没有握手成功?在哪里修改,跪求大神指教,在线等,急!!!谢谢!
2016年09月24日 08点09分 1
1