如何理解http代理服务器的cltSocket的消费流的流向
发布于 6 年前 作者 695954085 1990 次浏览 来自 问答

以下是nodejs.cn,http模块讲解的示例代码

const http = require('http');
const net = require('net');
const url = require('url');

// 创建一个 HTTP 代理服务器
const proxy = http.createServer((req, res) => {
  res.writeHead(200, { 'Content-Type': 'text/plain' });
  res.end('okay');
});
proxy.on('connect', (req, cltSocket, head) => {
  // 连接到一个服务器
  const srvUrl = url.parse(`http://${req.url}`);
  const srvSocket = net.connect(srvUrl.port, srvUrl.hostname, () => {
    cltSocket.write('HTTP/1.1 200 Connection Established\r\n' +
                    'Proxy-agent: Node.js-Proxy\r\n' +
                    '\r\n');
    srvSocket.write(head);
    srvSocket.pipe(cltSocket);
    cltSocket.pipe(srvSocket);
  });
});

// 代理服务器正在运行
proxy.listen(1337, '127.0.0.1', () => {

  // 发送一个请求到代理服务器
  const options = {
    port: 1337,
    hostname: '127.0.0.1',
    method: 'CONNECT',
    path: 'www.google.com:80'
  };

  const req = http.request(options);
  req.end();

  req.on('connect', (res, socket, head) => {
    console.log('已连接!');

    // 通过代理服务器发送一个请求
    socket.write('GET / HTTP/1.1\r\n' +
                 'Host: www.google.com:80\r\n' +
                 'Connection: close\r\n' +
                 '\r\n');
    socket.on('data', (chunk) => {
      console.log(chunk.toString());
    });
    socket.on('end', () => {
      proxy.close();
    });
  });
});

我不了解socket,cltSocket,srvSocket的数据流向? cltSocket,是不是有两个消费端,分别是socket,srvSocket?

5 回复

socket 是双向流。相互连接很正常。 readbable.pipe(writeable)

@MiYogurt cltSocket,是不是有两个消费端,分别是socket,srvSocket?

先搞懂流的类型吧。

@YuunYang 其实一开始我是想搞懂,为什么cltSocket作为一个中介的角色,当得到数据的时候,该数据到底是流向socket对象还是srvSocket对象。 但是通过阅读源码,我知道了当net.Socket实例调用write方法时候,是直接把数据传递给当前连接的远端socket对象。所以当socket.write()之后cltSocket接收到数据,触发cltSocket.pipe(srvSocket)方法里面的data事件回调 1532254492(1).png 其中dest.write(chunk)dest就是srvSocket对象。

回到顶部