从浏览器请求连接到 C# 程序后,WebSocket 没有响应
Posted
技术标签:
【中文标题】从浏览器请求连接到 C# 程序后,WebSocket 没有响应【英文标题】:No respond from WebSocket after request connection from browser to C# program 【发布时间】:2016-08-03 11:58:51 【问题描述】:我正在学习如何让我的 C# 程序与浏览器通信。 我在 C# 中使用 TCP,在 html5 浏览器中使用 WebSocket。
C#
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.IO;
namespace ShouldWork
public partial class Form1 : Form
public Form1()
InitializeComponent();
private void button1_Click(object sender, EventArgs e)
TCPServer server = new TCPServer();
System.Threading.Thread obj_thread = new System.Threading.Thread(server.startServer);
obj_thread.Start();
private void textBox1_TextChanged(object sender, EventArgs e)
private void button2_Click(object sender, EventArgs e)
TcpClient client = new TcpClient("127.0.0.1", 7000);
NetworkStream ns = client.GetStream();
byte[] data_tosend = createDataPacket(Encoding.UTF8.GetBytes(tx_data_send.Text));
ns.Write(data_tosend, 0, data_tosend.Length);
private byte[] createDataPacket(byte[] data)
byte[] initialize = new byte[1];
initialize[0] = 2;
byte[] separator = new byte[1];
separator[0] = 4;
byte[] datalength = Encoding.UTF8.GetBytes(Convert.ToString(data.Length));
MemoryStream ms = new MemoryStream();
ms.Write(initialize, 0, initialize.Length);
ms.Write(datalength, 0, datalength.Length);
ms.Write(separator, 0, separator.Length);
ms.Write(data, 0, data.Length);
return ms.ToArray();
class TCPServer
TcpListener listener;
public TCPServer()
listener = new TcpListener(IPAddress.Any, 7000);
public void startServer()
listener.Start();
while (true)
TcpClient client = listener.AcceptTcpClient();
NetworkStream ns = client.GetStream();
if(ns.ReadByte() == 2)
byte[] recv_data = readStream(ns);
Form1.ActiveForm.Invoke(new MethodInvoker(delegate
((TextBox)Form1.ActiveForm.Controls.Find("tx_recv_data", true)[0]).Text = Encoding.UTF8.GetString(recv_data);
));
public byte[] readStream(NetworkStream ns)
byte[] data_buff = null;
int b = 0;
String buff_length = "";
while ((b = ns.ReadByte()) != 4)
buff_length += (char)b;
int data_length = Convert.ToInt32(buff_length);
data_buff = new byte[data_length];
int byte_read = 0;
int byte_offset = 0;
while (byte_offset < data_length)
byte_read = ns.Read(data_buff, byte_offset, data_length - byte_offset);
byte_offset += byte_read;
return data_buff;
用户界面
当用户单击启动服务器按钮时,程序将启动 TCPServer。然后我们可以在第二个文本框中输入一些文本,然后我的代码将处理它并在第一个文本框中显示消息。
现在我想将客户端部分移至浏览器,因此我创建了一个简单的网络应用程序并测试连接。
代码 sn-p
<!DOCTYPE html>
<html>
<head>
<title>Socket demo</title>
</head>
<body>
<button type="button" onclick="testWebSocket()">Connect to C# server</button><br><br>
<script language="javascript" type="text/javascript">
function testWebSocket()
var socket = new WebSocket('ws://127.0.0.1:7000');
console.log("ssss");
socket.onopen = function()
console.log("on open");
socket.send("Hello");
socket.onclose = function(evt)
console.log("on close");
socket.onerror = function(evt)
console.log("on error");
console.log(evt.data);
</script>
</body>
</html>
这是出了什么问题..... onopen 功能似乎根本不起作用,chrome 控制台确实显示“sss”,仅此而已....
我使用的方法有问题吗?
【问题讨论】:
WebSocket 不仅仅是一个简单的 tcp 连接。它作为 HTTP 请求启动,然后“升级”到 WebSocket,因此您的服务器逻辑需要支持它。我建议您阅读 WebSocket 协议和连接流程。 或者,为 C# 获取一个已经支持连接协议和数据格式的 webSocket 服务器库并使用它进行构建。 @jishi 哦,我明白了,好吧,我会尝试阅读更多内容。 @jfriend00 你能给我推荐一些图书馆吗?我尝试了 SocketIoClientDotNet,但没有帮助 【参考方案1】:如 cmets 所示,WebSocket 使用自己的框架模式。
看看这个链接:https://hpbn.co/websocket/,特别是解释框架的部分:https://hpbn.co/websocket/#binary-framing-layer
连接永远不会打开的原因是因为它无法完成握手:https://hpbn.co/websocket/#http-upgrade-negotiation
【讨论】:
以上是关于从浏览器请求连接到 C# 程序后,WebSocket 没有响应的主要内容,如果未能解决你的问题,请参考以下文章
是否可以从 C# 应用程序连接到 32 位 C++ RPC 服务器应用程序