【问题标题】:How to create a simple socket in node.js?如何在 node.js 中创建一个简单的套接字?
【发布时间】:2016-11-07 19:05:47
【问题描述】:

我正在尝试创建一个虚拟套接字以用于我的一些测试

var net = require("net");

var s = new net.Socket();

s.on("data", function(data) {
  console.log("data received:", data);
});

s.write("hello!");

收到此错误

错误:此套接字已关闭。

我也试过用

创建套接字
var s = new net.Socket({allowHalfOpen: true});

我做错了什么?


作为参考,完整的测试如下所示

it("should say hello on connect", function(done) {

  var socket = new net.Socket();

  var client = Client.createClient({socket: socket});

  socket.on("data", function(data){
    assert.equal("hello", data);
    done();
  });

  client.connect();
  // writes "hello" to the socket
});

【问题讨论】:

    标签: node.js sockets mocking mocha.js


    【解决方案1】:

    我认为服务器没有进入监听状态。这是我用的..

    // server
    require('net').createServer(function (socket) {
        console.log("connected");
    
        socket.on('data', function (data) {
            console.log(data.toString());
        });
    })
    
    .listen(8080);
    
    // client
    var s = require('net').Socket();
    s.connect(8080);
    s.write('Hello');
    s.end();
    

    仅限客户端..

    var s = require('net').Socket();
    s.connect(80, 'google.com');
    s.write('GET http://www.google.com/ HTTP/1.1\n\n');
    
    s.on('data', function(d){
        console.log(d.toString());
    });
    
    s.end();
    

    【讨论】:

    • 我试图避免使用服务器组件
    • 我不明白。您只测试客户端套接字的写入能力?套接字必须连接到另一个套接字(例如服务器)才能在其上调用 .write()。
    • @user633183 你有想过这个吗?
    • 请注意,如果您实际上包含此代码的s.end(); 部分,那么套接字将被关闭,任何等待结束的进程都将退出。 (这很难学到。)
    【解决方案2】:

    试试这个。

    生产代码app.js:

    var net = require("net");
    
    function createSocket(socket){
        var s = socket || new net.Socket();
        s.write("hello!");
    }
    
    exports.createSocket = createSocket;
    

    测试代码:test.js: (Mocha)

    var sinon = require('sinon'),
        assert = require('assert'),
        net = require('net'),
        prod_code=require('./app.js')
    
    describe('Example Stubbing net.Socket', function () {
        it("should say hello on connect", function (done) {
            var socket = new net.Socket();
            var stub = sinon.stub(socket, 'write', function (data, encoding, cb) {
                console.log(data);
                assert.equal("hello!", data);
                done();
            });
            stub.on = socket.on;
            prod_code.createSocket(socket);
        });
    });
    

    【讨论】:

      【解决方案3】:

      您需要先连接您的套接字,然后才能写入:

      var PORT = 41443;
      
      var net = require("net");
      
      var s = new net.Socket();
      
      s.on("data", function(data) {
        console.log("data received:", data);
      });
      s.connect(PORT, function(){
          s.write("hello!");
      });
      

      【讨论】:

      • node-0.10.30Error: connect ECONNREFUSED
      【解决方案4】:

      我们可以使用 net npm 模块创建套接字服务器并在任何地方进行监听。创建套接字服务器后,我们可以检查使用 telnet(客户端套接字)与服务器交互。

      server.js

      'use strict';
      
      const net = require('net');
      const MongoClient= require('mongodb').MongoClient;
      const PORT = 5000;
      const ADDRESS = '127.0.0.1';
      const url = 'mongodb://localhost:27017/gprs';
      
      let server = net.createServer(onClientConnected);
      server.listen(PORT, ADDRESS);
      
      function onClientConnected(socket) {
        console.log(`New client: ${socket.remoteAddress}:${socket.remotePort}`);
        socket.destroy();
      }
      
      console.log(`Server started at: ${ADDRESS}:${PORT}`);
      
      function onClientConnected(socket) {
      
        let clientName = `${socket.remoteAddress}:${socket.remotePort}`;
        console.log(`${clientName} connected.`);
        socket.on('data', (data) => {
          let m = data.toString().replace(/[\n\r]*$/, '');
          var d = {msg:{info:m}};
          insertData(d);
          console.log(`${clientName} said: ${m}`);
          socket.write(`We got your message (${m}). Thanks!\n`);
        });
      
        socket.on('end', () => {
          console.log(`${clientName} disconnected.`);
        });
      
      }
      
      function insertData(data){
        console.log(data,'data');
              MongoClient.connect(url, function(err, db){
              console.log(data);
              db.collection('gprs').save(data.msg , (err,result)=>{
                  if(err){
                      console.log("not inserted");
                  }else {
                      console.log("inserted");
                  }
              });
          });
      }
      

      使用远程登录:

      $ telnet localhost 5000
      Trying 127.0.0.1...
      Connected to localhost.
      Escape character is '^]'.
      hi
      We got your message (hi). Thanks!
      

      【讨论】:

        【解决方案5】:

        这将是 websocket 的有用代码

        'use strict';
        
        const express = require('express');
        const { Server } = require('ws');
        const bodyParser = require('body-parser');
        const  cors = require('cors');
        
         
        const PORT = process.env.PORT || 5555;
        const INDEX = '/public/index.html';
        
        const router = express.Router();
        
        var urlencodedParser = bodyParser.urlencoded({ extended: false });
        
        router.get('/', function(req, res) {
            res.sendFile(INDEX, { root: __dirname });
        });
        
        const server = express()
          .use(router)
          .use(bodyParser.json())
          .use(cors)
          .listen(PORT, () => {
            console.log(`Listening on ${PORT}`)
          });
        
        const wss = new Server({ server });
        
        wss.on('connection', (ws) => {
            ws.on('message', message => {
                var current = new Date();
              console.log('Received '+ current.toLocaleString()+': '+ message);
              wss.clients.forEach(function(client) {
                client.send(message);
        
                var getData = JSON.parse(message);
                var newclip = getData.clipboard;
                var newuser = getData.user;
        
                console.log("User ID : "+ newuser);
                console.log("\nUser clip : "+ newclip);
            });
          });
        });

        【讨论】:

          猜你喜欢
          • 2020-08-27
          • 2013-12-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-01-18
          • 1970-01-01
          相关资源
          最近更新 更多