首页 > 解决方案 > 为什么我的 Javascript 套接字连接到 Web 服务器而不是本地主机?

问题描述

我正在使用 ExtendScript(基本上是带有一堆 FM 特定对象和方法的 Javascript)为 Adob​​e FrameMaker 创建一个插件。由于没有浏览器,我无法使用任何基于 Web 的库连接到服务器。我一直在使用 Socket,当我连接到我的一个托管域时它工作正常。出于测试和演示的目的,我现在想连接到我的本地主机,它上面运行着 XAMPP 包。

从 Web 浏览器连接到 localhost 工作正常,所以我知道我请求的页面存在并且本地 Apache 正在工作。但是当我从我的脚本中请求相同的页面时,我得到了一个错误的请求错误。检查 Apache 访问日志,我发现发送到套接字的行被误解:协议后的第一个 \r\n 显示为 HTTP/1.1 字符串后面的 \n。这是 Apache 访问日志中的两行,第一行来自本地 Web 浏览器的请求,第二行来自套接字:

::1 - - [23/Sep/2021:09:19:32 +0100] "GET /index.html HTTP/1.1" 304 - "-" "Mozilla [etc]"
::1 - - [23/Sep/2021:09:20:51 +0100] "GET /index.html HTTP/1.1\n" 400 331 "-" "-"

我用来连接服务器的 javascript 在这里:

var sHost = 'localhost';
var oSocket = new Socket;
oSocket.open( sHost + ':80', 'UTF-8' );
oSocket.write ( 'GET /index.html HTTP/1.1\r\nHost:' + sHost + '\r\n\r\n' );
var sReply = oSocket.read( );
alert( sReply );

运行此代码会给出 400 Bad Request 响应。当我将主机更改为我的 Web 域之一而不进行任何进一步更改时,我得到 200 响应代码和请求的页面。当然,将 'localhost/index.html' 放在我的浏览器中会使页面没有任何问题。

这可能是 Apache 访问设置问题,但我无法弄清楚问题可能出在哪里。我有一个全新的 XAMPP 安装,并且没有更改任何默认设置。似乎在处理传入请求时,浏览器和套接字之间的处理方式有所不同,这导致 \n 保持连接到协议标识符,并且当然会抛出 Apache http 服务器。但是如何正确解析协议字符串呢?当我遵循协议并且它适用于互联网上的服务器时,为什么我需要跳过浏览器中的那些箍?

感谢您提供帮助我解决此问题并能够在本地托管页面(以及本地 MySQL 数据库,而不必将它们放在 Internet 中的某个服务器上)的指针 - 请不要参考 Web 套接字或任何面向 Web 的库,因为我不能在我的应用程序中使用它们。Socket 对象是我唯一可用的工具。

标签: javascriptapachesocketshttp

解决方案


推荐阅读