-
-
Save tedmiston/5935757 to your computer and use it in GitHub Desktop.
/* | |
In the node.js intro tutorial (http://nodejs.org/), they show a basic tcp | |
server, but for some reason omit a client connecting to it. I added an | |
example at the bottom. | |
Save the following server in example.js: | |
*/ | |
var net = require('net'); | |
var server = net.createServer(function(socket) { | |
socket.write('Echo server\r\n'); | |
socket.pipe(socket); | |
}); | |
server.listen(1337, '127.0.0.1'); | |
/* | |
And connect with a tcp client from the command line using netcat, the *nix | |
utility for reading and writing across tcp/udp network connections. I've only | |
used it for debugging myself. | |
$ netcat 127.0.0.1 1337 | |
You should see: | |
> Echo server | |
*/ | |
/* Or use this example tcp client written in node.js. (Originated with | |
example code from | |
http://www.hacksparrow.com/tcp-socket-programming-in-node-js.html.) */ | |
var net = require('net'); | |
var client = new net.Socket(); | |
client.connect(1337, '127.0.0.1', function() { | |
console.log('Connected'); | |
client.write('Hello, server! Love, Client.'); | |
}); | |
client.on('data', function(data) { | |
console.log('Received: ' + data); | |
client.destroy(); // kill client after server's response | |
}); | |
client.on('close', function() { | |
console.log('Connection closed'); | |
}); |
So I took this example and modified it slightly such that the client writes data to the server. This should be doable since the client socket does support a write. In one of my use cases the client sends a fair amount of data to server in which case I get an ECONNRESET error. Attached are client1 and server1 snippets. I was wondering if anyone has seen this and if they know what is going wrong under the covers.
Thanks in advance
BigDog6432
Client1:
var net = require('net');
var client = new net.Socket({writeable: true}); //writeable true does not appear to help
client.on('close', function() {
console.log('Connection closed');
});
client.on('error', function(err) {
console.error('Connection error: ' + err);
console.error(new Error().stack);
});
client.connect(52275, '127.0.0.1', function() {
var count = 0;
console.log('Connected');
for(var i = 0; i < 100000; i++) {
client.write('' + i + '');
//bufferSize does not seem to be an issue
//console.info(client.bufferSize);
}
});
Server1:
var net = require('net');
var count = 0;
var server = net.createServer(function(socket) {
socket.pipe(socket); //With this uncommented I get an ECONNRESET exception after 14299 writes with it commented it
hangs after 41020 writes
socket.on('data', function(data) {
console.info(count++); //This makes it occur sooner
//count++;
//maxConnections is not the issue
//server.getConnections(function(err, count) {
//console.info('count = ' + count);
//});
});
socket.on('close', function() {
console.info('Socket close');
});
socket.on('error', function(err) {
console.error('Socket error: ' + err + ', count = ' + count);
console.error(new Error().stack);
});
});
server.listen(52275, '127.0.0.1');
I think I solved my own issue. I believe the issue had to do with not all of the event listeners close, data, drain, end, lookup, timeout were implemented. I have been playing around and did not expect that the client would receive back a data or drain event to be called which in turn I believe resulted in the error.
Hi everyone!
i'm connecting to a telnet server:
`var net = require('net');
var client = new net.Socket();
client.connect(23, '192.168.1.180', function() {
console.log('Connected');
});
client.on('error', function(err) {
console.error('Connection error: ' + err);
console.error(new Error().stack);
});
client.on('data', function(data) {
console.log('Received: ' + data);
client.destroy();
});
client.on('close', function() {
console.log('Connection closed');
});
but the
console.log('Received: ' + data);is: ??%??☺??♥??'??▼?? ?? I was waiting for a login message or something like that. then i try to use
.toString('utf8')on data. but is the same log. when i use
typeof(data);` and the result is a object.
please help!!!!!!.
I'm sure the connection to my telnet server is correct
How can I do this in TypeScript?
Coool. I have my server on C and this connects perfectly with the server. Thanks :D
Why I have error?
connect ETIMEDOUT
Hi
In your code, you are closing the client after getting response from TCP server. What if I want to get a response in a loop continuously? I tried using promises with the following code: (My TCP client is in NodeJS and TCP server is external JAVA application, which waits for request from client and sends the response to client).
function getData(cmd){ return new Promise(function(resolve, reject){ client.on('data', function (data){ console.log("!!!!!! promise called"); resolve(data); }); client.on('error',function (error){ reject(error); }); client.write(cmd); }) .catch(function (error) { // oops, error console.log(error.message); }); }
Where client is a global variable representing TCP socket client initialized once in the beginning to IP address and port number. I call this function in a a loop something like this:
Timer loop{
getData("RET").then(.....act on data....).catch(...flag errors ...)
}``
It works fine , but every time server returns one extra "console.log("!!!!!! promise called");" line. Once in first cycle, twice in second, thrice in third and so on... It keeps adding an client.on listener and crosses the limit of linterers in nodeJS. What is wrong in the above code? How to rectify it?
hi
is it a server.listen(1337, '127.0.0.1'); command change to another port?
i try it and it work only on 1337
i need to listen on 5 5 different ports
you could probably set up some kind of nginx proxy_pass redirection scheme that forwards all incoming http requests that come in on a given set of specific ports to a single port that your web server socket has bound to
I've done this for a single port to port redirection (in my use case it was coupled with https termination but that is irrelevent to your situation.)
in principle I don't see why that wouldn't work. or just run 5 web servers but thats misguided if they are just doing the same work, depending on what your scaling needs are.
client.write do not really send data to the server, it just writes over the same socket of the client.
---edit----
Ok, I just figured it out the server is an ECHO server, which means, it sends what it received.
so client.write send information to the server and the server response it, the problem I was having is: the event server.on('data') was not being triggered, that is because server.on('data') do not hold the SOCKET of the server, it held in the moment of the initialization of the server in net.CreateServer callback function.
That is it.
Hello, i want to use this to create a 3 way chat service on the command line. I created the server using your code, and connected to it from two terminal windows using the ncat, however the server only echo's each clients request back to that particular client. I want to echo back to each client, so that it feels like a group chat?
This is really fun, I have been playing with this today and you have definitely distracted me. Ignore my previous issue, I have progressed and now have a basic “chat room” with multiple clients.. I have been using ncat as the client, but I need more logic so I’m trying to implement your node client. So far it works, connects to the server and writes the initial text..
But all subsequent message don’t seem to go back to the server?
Apart from the very first client.write how do I send a mother client.write after the user hits enter?
This is really fun, I have been playing with this today and you have definitely distracted me. Ignore my previous issue, I have progressed and now have a basic “chat room” with multiple clients.. I have been using ncat as the client, but I need more logic so I’m trying to implement your node client. So far it works, connects to the server and writes the initial text..
But all subsequent message don’t seem to go back to the server?
Apart from the very first client.write how do I send a mother client.write after the user hits enter?
newbies who visit this many years later may find this video on youtube helpful to get started with the server side https://www.youtube.com/watch?v=HyGtI17qAjM
Is Hello, server! Love, Client.
guaranteed to print? It seems like there's a race condition.
Actually, is anything other than E
guaranteed to print?
Hi, is it possible to use this to connect to a network share (smb1)?
The output:
Connected Received: Echo server Hello, server! Love, Client. Connection closed
all is fine
this gist was really helpful for me, thank you dude
Hi guys and gals,
I'm trying to create a simulator using Javascript for the front end which I can do, but I'm having a hard time with Node.js for the backend. When I click on, say, a Cisco router icon, I want the a physical connection to occur between my PC and the physcial router that is connected via ethernet. It is a laboratory router (no internet connection). I was thinking that I should download the NPM package telnet-client and require it in the node.js file. I don't know what to do from there. I assume I have to require net as well. Will someone help me. Please... Pretty please :)
Please use arrow functions!
hello, how can you prevent DDOS attacks on this code?
how to set tcp headers on request and receive in the server
how to set tcp headers on request and receive in the server
I don't think you can set headers with TCP. HTTP maybe what you are looking for
'Received: ' + data
I also have a same issue.......
require("net") is not working in 16.13.1
when i move to 18.x now it says digital envelope routines unsupported
.......
you try to connect to another pc port? if yes, make sure to allow inbound firewall
this gist was really helpful for me, thank you dude
same! thank you!
I have multiple simultaneous connections. how can I write to a particular client if the remotePort and remoteAddress is stored to the DB. the new Socket() command does not work in my case because it creates a new instance of this.
Thank you!