我正在尝试实现一个C# web socket服务器,但它给我带来了一些麻烦。我正在运行web服务器(ASP.NET)来托管带有javascript的页面,并且web套接字服务器是作为C#控制台应用程序实现的。
我能够检测到来自客户端的连接尝试(运行javascript的chrome),也能够从客户端检索握手。但是客户端似乎不接受我发回的握手( web套接字上的onopen
函数从不被调用)。
我一直在阅读The Web Socket protocol,我看不出我做错了什么。下面是服务器代码的一部分:
Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
IPEndPoint ep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8181);
listener.Bind(ep);
listener.Listen(100);
Console.WriteLine("Wainting for connection...");
Socket socketForClient = listener.Accept();
if (socketForClient.Connected)
{
Console.WriteLine("Client connected");
NetworkStream networkStream = new NetworkStream(socketForClient);
System.IO.StreamWriter streamWriter = new System.IO.StreamWriter(networkStream);
System.IO.StreamReader streamReader = new System.IO.StreamReader(networkStream);
//read handshake from client:
Console.WriteLine("HANDSHAKING...");
char[] shake = new char[255];
streamReader.Read(shake, 0, 255);
string handshake =
"HTTP/1.1 101 Web Socket Protocol Handshake\r\n" +
"Upgrade: WebSocket\r\n" +
"Connection: Upgrade\r\n" +
"WebSocket-Origin: http://localhost:8080\r\n" +
"WebSocket-Location: ws://localhost:8181\r\n" +
"\r\n";
streamWriter.Write(handshake);
streamWriter.Flush();
我运行到端口8080上的web服务器和端口8181上的web套接字服务器,两者都在我的本地主机上。
我尝试过用不同的编码(ASCII、字节和十六进制)发送握手,但这似乎没有什么不同。连接永远不会完全建立。javascript如下所示:
var ws;
var host = 'ws://localhost:8181';
debug("Connecting to " + host + " ...");
try {
ws = new WebSocket(host);
} catch (err) {
debug(err, 'error');
}
ws.onopen = function () {
debug("connected...", 'success');
};
ws.onclose = function () {
debug("Socket closed!", 'error');
};
ws.onmessage = function (evt) {
debug('response: ' + evt, 'response');
};
我猜错误出在C#服务器上,因为chrome像它应该发送的那样发送信息,但正如上面所说的,onopen
函数从未被调用过。
简而言之,我的问题是:,你们中有没有人做到过这一点--如果有,你们是如何做到的?当然:您是否在代码中看到任何明显的错误(希望这不是问得太多)
发布于 2010-02-06 18:07:42
可能是编码问题。这是我写的一个正常工作的C#服务器:
class Program
{
static void Main(string[] args)
{
var listener = new TcpListener(IPAddress.Loopback, 8181);
listener.Start();
using (var client = listener.AcceptTcpClient())
using (var stream = client.GetStream())
using (var reader = new StreamReader(stream))
using (var writer = new StreamWriter(stream))
{
writer.WriteLine("HTTP/1.1 101 Web Socket Protocol Handshake");
writer.WriteLine("Upgrade: WebSocket");
writer.WriteLine("Connection: Upgrade");
writer.WriteLine("WebSocket-Origin: http://localhost:8080");
writer.WriteLine("WebSocket-Location: ws://localhost:8181/websession");
writer.WriteLine("");
}
listener.Stop();
}
}
以及托管在localhost:8080
上的相应客户端
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<script type="text/javascript">
var socket = new WebSocket('ws://localhost:8181/websession');
socket.onopen = function() {
alert('handshake successfully established. May send data now...');
};
socket.onclose = function() {
alert('connection closed');
};
</script>
</head>
<body>
</body>
</html>
此示例仅建立握手。您将需要调整服务器,以便在建立握手后继续接受数据。
发布于 2010-12-08 10:20:08
发布于 2012-05-24 22:51:10
.NET Framework4.5在Windows Communication Foundation中引入了对WebSockets的支持。WebSockets是一种高效的、基于标准的技术,支持通过标准HTTP端口80和443进行双向通信。标准超文本传输协议端口的使用允许WebSockets通过中介在web上进行通信。添加了两个新的标准绑定,以支持通过WebSocket传输进行通信。NetHttpBinding和NetHttpsBinding。通过访问WebSocketSettings属性,可以在HttpTransportBinding元素上配置特定于WebSocket的设置。
但我认为它仍然使用SOAP
http://msdn.microsoft.com/en-us/library/hh674271(v=vs.110).aspx
https://stackoverflow.com/questions/2211898
复制相似问题