使用 Javascript 与 SQL 服务器握手

Posted

技术标签:

【中文标题】使用 Javascript 与 SQL 服务器握手【英文标题】:handshaking a SQL server with Javascript 【发布时间】:2011-09-06 17:48:25 【问题描述】:

作为学习练习,我想尝试让我的 javascript 与 sql 聊天。

var ws = new WebSocket("ws://127.0.0.1:1433");

似乎不是一个被阻塞的端口,所以理论上它应该可以工作。

我正在寻找有关如何与 sql server 握手并与之聊天的详细信息。

非常感谢您提供正确方向的指针 (甚至是解释为什么它不起作用的原因。)

我想在 Microsoft SQL 2008 R2 上试试这个。

【问题讨论】:

WebSockets 和 mysql 的通信协议不同,因此上述方法不起作用。 MySQL Protocol != WebSocket Protocol 你说的是哪个 SQL 服务器?我不知道有任何支持 WebSockets 的数据库服务器。记住,WebSocket != Socket. @Hylangelo:这是我正在寻找的东西,据我了解,websocket 与普通套接字是一样的(例如,我想如果我发送正确的十六进制来握手等,它应该可以工作) 从未玩过它(并且它已被弃用)您是否在 SQL Server 中寻找 xml webservices? SQL Server Authentication over SOAP 与 Javascript 相关的许多事情一样:仅仅因为你可以,并不意味着你应该。 【参考方案1】:

MS SQL 没有基于文本的协议来允许您通过 telnet 与其交互。您可以使用 Web 套接字来确定目标服务器正在侦听 1433,但完成登录序列的最佳选择是使用 sql 客户端 api。

【讨论】:

更不用说将您的 SQL 服务器直接暴露给浏览器客户端这一事实,委婉地说,是一个职业生涯终结的举动。【参考方案2】:

SQL Server 连接使用 TDS 协议,该协议记录在 Tabular Data Stream Protocol Specification 中。如果您遵循协议规范,请查阅protocol examples 并查看FreeTDS 开源实现,您应该能够使用基本套接字进行低级握手等等。但是,除了学术练习之外,这样做真的没有任何意义。但是棺材里的钉子是WebSockets,它们不是基本的套接字。

可行的方法是使用 Web 服务接口(最好是 REST,可能是 OData)将 SQL Server 数据库公开到 Web,然后从您的 Javascript html5 应用程序中使用此 Web 服务。这是一个很好的阅读:Creating an OData API for *** including XML and JSON in 30 minutes。

【讨论】:

【参考方案3】:

在 HTML5 中,JavaScript 可以使用 SQLite 直接与 SQL 通信。虽然我不确定您对“聊天”的定义是什么,但请谨慎回答。http://html5doctor.com/introducing-web-sql-databases/

【讨论】:

【参考方案4】:

尽管 WebSockets 名称中有“Socket”,尽管事实上 WS 运行在 TCP 之上(使用基于 HTTP 的初始握手),但 WS 不是 TCP。 我不知道 MS SQL Server 使用的前端协议,但它不太可能与 WS 框架兼容。

你能做的大概如下:

浏览器 WS 代理 SQL Server

对于代理,你可能想看看

https://github.com/kanaka/websockify

这个宝贝可以让你通过 WS 与代理进行通信,代理会解开 WS 有效负载,并将其变成纯 TCP 流。

这样应该可以与 SQL Server 对话......这可能需要大量工作,而且我不知道 SQL Server 协议文档有多好/开放。

对于 PostgreSQL,前端协议是完全开放且有据可查的。

如果不清楚我上面的意思是什么,我可以详细说明.. 或 ping kanaka 询问他的想法.. kanaka = 代理的作者,无论如何在 WS 上非常活跃。

【讨论】:

这实际上是我整个星期感兴趣的最接近的人。 还有一个额外的考虑(如果你真的想试一试):在浏览器和代理之间,它是 WS。使用 WS,您有 2 种有效负载:文本 (utf-8) 或二进制。直到最近 Chrome 才增加了对二进制的支持。 kanaka 代理能够将 base64 编码的文本消息解包成二进制 TCP。这适用于 Chrome 和 FF。当然,更有效的方法是跳过这种包装并使用二进制 WS 消息。您需要 Chrome 15 来做到这一点(今天)。而且我不知道代理是否可以选择关闭 base64 展开(但我猜是这样)。【参考方案5】:

典型的 SQL 服务器没有直接的 HTTP 接口,即不允许浏览器直接连接。 然而,使用 php 或任何服务器端语言制作这样的不安全界面并不难:

<?php
$query = mysql_query($_REQUEST['q']);
$dbResult = exeute($query); 
// execute is an imaginary function, you can use any function/library you want
echo json_encode($dbResults);

试试 MangoDB,它有一个 HTTP 接口: Simple REST Api

您可以通过添加服务器/用户/数据库/密码参数使其更加动态,但如果页面是公开的,它将更加不安全。

【讨论】:

【参考方案6】:

如果您使用微软提供的 ADO 对象,您应该能够与 sql 数据库进行通信。 http://msdn.microsoft.com/en-us/library/ms681519(v=vs.85).aspx

我知道您可以与 sql 数据库“聊天”。乡巴佬,我不确定你可以在普通的网络浏览器中做到这一点。在工作中,我们使用hta 和内部 MySQL 服务器来实现。

【讨论】:

【参考方案7】:

哇!不要感觉不好,哥们,你完全错了。 JavaScript 是一种语言,它具有出色的非阻塞 i/o 功能。这段代码扼杀了它的全部精神。

任何数据库代码在 js 中最终都应该是这样的。

getRemoteData('remoteURL', callback(data)

    // Use your data here
);

语言中有很多好的部分。学习使用它。

如果你想进行实时聊天,couchDB 和 JavaScript 一起使用将是一个不错的选择。 Node.js 也很出色。 SQL 不是用于实时应用程序的东西

【讨论】:

以上是关于使用 Javascript 与 SQL 服务器握手的主要内容,如果未能解决你的问题,请参考以下文章

在C#里连接SQL 2008 报错:已成功与服务器建立连接 但登录前握手期间发生错误 网络名不可再用

已成功与服务器建立连接,但是在登录前的握手期间发生错误。

SQL Server 登录前握手

Websocket握手不起作用

已成功与服务器建立连接,但是在登录前的握手期间发生错误。 (provider: SSL Provider, error: 0 - 等待的

websocket握手问题