WinRT - StreamSocket - 通过LoadAsync读取数据时关闭连接

时间:2013-01-20 16:05:49

标签: javascript sockets windows-8 windows-runtime

我正在尝试通过StreamSocket发送HTTP请求,但响应被

截断

“failedWinRTError:对象已关闭。”


这是我的代码:

  var count, hostName, raw_request, raw_response, reader, socketProtection, startReader, streamSocket, writer;
  streamSocket = new Windows.Networking.Sockets.StreamSocket();

  hostName = new Windows.Networking.HostName("www.reddit.com", "80");

  raw_response = "";

  count = 0;

  startReader = function() {
    return reader.loadAsync(8 * 1000).done(function(bytesRead) {

      raw_response += reader.readString(reader.unconsumedBufferLength);
      if (raw_response.indexOf("</html>") > 0) {
        return;
      } else {
        startReader();
      }
    }, function(error) {

      raw_response += reader.readString(reader.unconsumedBufferLength);
      window.raw_response = raw_response;
      return;
    });
  };

  streamSocket.connectAsync(hostName, "80", 0).done(function(response) {
    var string;

    reader = new Windows.Storage.Streams.DataReader(streamSocket.inputStream);
    reader.inputStreamOptions = 1;

    writer = new Windows.Storage.Streams.DataWriter(streamSocket.outputStream);
    string = "Hello world";
    writer.writeString(raw_request);
    return writer.storeAsync().done(function() {
      writer.flushAsync();
      writer.detachStream();
      return startReader();
    });
  });

我注意到响应的开头也被截断了。

这是我在HTTP响应开始时得到的结果。

  

/1.1 200 OK

同样奇怪的是...... HTTPS请求工作正常。


知道我做错了什么吗?谢谢:))

1 个答案:

答案 0 :(得分:2)

从主机名中删除 http:// ,不需要第二个参数:

var hostName = new Windows.Networking.HostName("www.reddit.com");

ConnectAsync 中使用此对象,只需要主机名和服务名称参数:

streamSocket.connectAsync(hostName, "80").done(function (response) {
    // ....
}, function (error) {
    console.log(error);
});

UPDATE:好的,如果连接正在关闭,服务器可能会关闭它。你发送的请求是否合格?这是一个例子:

var raw_request, raw_response, reader, writer;
var streamSocket = new Windows.Networking.Sockets.StreamSocket();

function doRequest() {
    var hostName = new Windows.Networking.HostName("www.reddit.com");
    streamSocket.connectAsync(hostName, "808").then(function () {
        reader = new Windows.Storage.Streams.DataReader(streamSocket.inputStream);
        reader.inputStreamOptions = Windows.Storage.Streams.InputStreamOptions.partial;
        writer = new Windows.Storage.Streams.DataWriter(streamSocket.outputStream);

        raw_request = "GET / HTTP/1.1\r\nHost: www.reddit.com/\r\nConnection: close\r\n\r\n";
        writer.writeString(raw_request);
        return writer.storeAsync();
    }).then(function () {
        raw_response = "";
        return startReader();
    }, function (error) {
        console.log(error);
    });
}

function startReader() {
    return reader.loadAsync(99999999).then(function (bytesRead) {
        raw_response += reader.readString(reader.unconsumedBufferLength);
        if (bytesRead === 0) {
            window.raw_response.value = raw_response;
            return;
        }
        return startReader();
    });
};