如何在 node.js 中创建一个简单的套接字?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/18664530/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-02 15:32:40  来源:igfitidea点击:

How to create a simple socket in node.js?

node.jssocketsmockingmocha

提问by Thank you

I'm trying to create a dummy socket for use in some of my tests

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

var net = require("net");

var s = new net.Socket();

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

s.write("hello!");

Getting this error

收到此错误

Error: This socket is closed.

错误:此套接字已关闭。

I've also tried creating the socket with

我也试过用

var s = new net.Socket({allowHalfOpen: true});

What am I doing wrong?

我究竟做错了什么?



For reference, the complete test looks like this

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

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
});

回答by John Williams

I don't think the server is put into listening state. This what I use..

我不认为服务器处于监听状态。这是我用的..

// 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();

Client only..

仅限客户..

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();

回答by zs2020

Try this.

尝试这个。

The production code app.js:

生产代码app.js

var net = require("net");

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

exports.createSocket = createSocket;

The test code: test.js: (Mocha)

测试代码:test.js:(摩卡)

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);
    });
});

回答by Ido Ofir

you need to connect your socket before you can write to it:

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

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!");
});

回答by KARTHIKEYAN.A

We can create socket server using netnpm module and listen from anywhere. after creating socket server we can check using telnet(client socket) to interact server.

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

server.js

服务器.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");
            }
        });
    });
}

using telnet:

使用远程登录:

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