【问题标题】:node js http createServer socket节点 js http createServer 套接字
【发布时间】:2022-02-06 18:14:14
【问题描述】:

with 代码的疑问有两点:

  1. 当我通过浏览器发送请求时,我没有收到“已连接”的控制台日志消息,但如果我使用 http.get() 或 http.request() ,它工作正常 2) "connect" 事件接收到一个带有 req,clientSocke,head 的回调!现在我在哪里可以看到服务器套接字?

    const http=require("http")
    
    const server=http.createServer()
    server.on("connect",(req,c_socket,head)=>{
    
     console.log("connected")
    
    })
    server.listen(5000,()=>{console.log("server up)})
    

【问题讨论】:

    标签: node.js http events


    【解决方案1】:
    1. 当您通过浏览器访问服务器时,方法是使用 GET 而不是 CONNECT。这就是为什么 console.log 没有显示的原因。 如果您希望在从浏览器访问时显示console.log,可以使用request 事件。

    这是来自 node.js 文档的解释。

    每次服务器响应请求时都会发出'connect'事件 使用 CONNECT 方法。如果这个事件没有被监听, 接收 CONNECT 方法的客户端将关闭其连接。 node.js docs

    1. 您可以使用net 包和createSever 方法制作套接字服务器。 这是一个如何向套接字服务器发出简单请求的示例。
    const http = require('http');
    const net = require('net');
    const { URL } = require('url');
    
    const server = http.createServer((req, res) => {
      res.writeHead(200, { 'Content-Type': 'text/plain' });
      res.end('hello world');
    });
    
    server.on('connect', (req, clientSocket, head) => {
      console.log('connected');
      // Connect to an origin server
      const { port, hostname } = new URL(`http://${req.url}`);
      const serverSocket = net.connect(port || 80, hostname, () => {
        clientSocket.write(
          'HTTP/1.1 200 Connection Established\r\n' +
            'Proxy-agent: Node.js-Proxy\r\n' +
            '\r\n'
        );
        serverSocket.write(head);
        serverSocket.pipe(clientSocket);
        clientSocket.pipe(serverSocket);
      });
    });
    
    server.listen(5000, () => {
      console.log('server up');
    });
    
    // Make a request to a tunneling server
    const req = http
      .request({
        port: 5000,
        host: 'localhost',
        method: 'CONNECT',
        path: 'www.google.com:80',
      })
      .end();
    
    req.on('connect', (res, socket, head) => {
      console.log('got connected!');
    
      // Make a request over an HTTP tunnel
      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', () => {
        console.log('end');
      });
    });
    

    【讨论】:

    • 但是我们如何将数据从客户端发送到服务器?什么时候调用 http.createServer() 回调?
    • 以及如何查看 head 参数中的内容?当我 console.log(head) 它返回为“
    猜你喜欢
    • 2017-02-04
    • 2012-12-15
    • 2015-09-12
    • 2016-08-08
    • 2018-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-02
    相关资源
    最近更新 更多