tcpnet
文件大小: unknow
源码售价: 5 个金币 积分规则     积分充值
资源说明:Create zero config horizontal tcp cluster
#tcpnet

> Creates TCP connections between nodes without configuration.

## Installation

```sheel
npm install tcpnet
```

If the module dosn't work checkout the `node-mdns` [install instructions](https://github.com/agnat/node_mdns#installation).

## Example

```javascript
var tcpnet = require('tcpnet');

// Create a service called my-cluster, for every TCP connection
// pipe the output to the terminal
var service = tcpnet('my-cluster', function (socket) {
  socket.pipe(process.stdout);
});

// For every one second send a message to all other services on the network
var randomId = require('crypto').randomBytes(6).toString('hex');
setInterval(function () {
  console.log('write to ' + service.connections.length + ' nodes');
  service.connections.forEach(function (socket) {
    socket.write('message from ' + randomId  + '\n');
  });
}, 1000);

// Pick a random port, and use all available addresses
service.listen(0, '0.0.0.0');
```

Now startup a few node.js processes with this code, and you will see this:

```shell
$node demo.js

write to 2 nodes
message from a6c953a8c1f1
message from 4eba8c4e76e9
write to 2 nodes
message from a6c953a8c1f1
message from 4eba8c4e76e9
```

## API documentation

> In more detail this is a module for creating a [fully connected](http://en.wikipedia.org/wiki/File:NetworkTopology-FullyConnected.png)
node cluster, this means that each node is aware of all other running nodes by
a TCP connection. For the time being this is limited to a local network, that
means you can't connect nodes across the internet, however connection nodes
on a local network (switch or router) works perfectly.

### service = tcpnet(settings, [connection])

This function creates a new service instance.

The `settings` argument is required and can be a `string` or an `object`.
Starting with the `string` case. This is the name of the service and is
the only thing there must be shared between all services (nodes).

Example: this code creates two services, they share the same name so they
will automaticly be connected.

```javascript
var serviceA = tcpnet('my-cluster');
    serviceA.listen();

var serviceB = tcpnet('my-cluster');
    serviceB.listen();
```

The `settings` argument can also be an `object`, this provides some more
options, there are given by the following paramenters:

* `name` required - exactly the same as the `string` case.
* `uuid` optional - each service instance **must** have a unique ID,
 if two service instances share the same `udid` they can't connect
 and may not be able to reach all other servies, with diffrent IDs.
 By default the uuid is created by the [gmid](https://github.com/AndreasMadsen/gmid)
 module. Note there are two requirements for the uuid. One, it must be a
 hexidecimal string (e.g. `BADA55`). Two, they all ids must have a fixed
 length (e.g. `AA` and `CCCCCC` won't work).

The next argument `connection` is a optional function there if given, will
be added as a `connection` event handler.

Example: this code will do the same as the one below:

```javascript
var service = tcpnet('my-cluster', function (socket) {
  // do something with the TCP socket
});

service.listen();
```

```javascript
var service = tcpnet('my-cluster');

service.on('connection', function (socket) {
  // do something with the TCP socket
});

service.listen();
```

### service.listen([port], [address], [callback])

The first argument `port` is no big surprise, its the port that the
service will use to receive other connections. By default `port` is `0`
which is just a random available `port` assigned by the OS.

The second argument `address` is the address you want to listen on, by
default `address` is `0.0.0.0` which is all available addresses (localhost
and public). Do also note that `address` can be a domain (e.q. `localhost`), it
will just be resoved to a IP address by a DNS lookup.

Example: 3 ways to listen on only the loopback interface.

```javascript
service.listen(0, '127.0.0.1');
service.listen(0, '::1');
service.listen(0, 'localhost');
```

_NOTE: because there apear to be a bug in `MDNS` a public only address
(e.q. `192.168.0.198`) is not allowed, if you wan't the service to be public
you will have to use `0.0.0.0` for the time being._

The third argument `callback` is just an `listening` event handler.

```javascript
service.listen(function () {
  console.log('service is ready');
});
```

### service.address()

This method will return an object containing two properties:

* `port`
* `addresses`

NOTE: do not use this before the `listening` has emitted, if you do so it will
return `null`.

Example: show the port and addresses that the service is listening on:

```javascript
service.listen(0, '0.0.0.0', function () {
  console.log('service is ready and listening on:');

  var info = service.address();
  info.addresses.forEach(function (address) {
    console.log('- ' + address + ':' + info.port);
  });
});

/*  Output could be:
 * - 127.0.0.1:52740
 * - 192.168.0.198:52740
 * - ::1:52740
 * - fe80::5ab0:35ff:fe84:84b1:52740
*/
```

### service.connections

This is a dynamic array containing all online sockets. This means that sockets
will be added once the `connection` event fires and removed once socket `close`
event fires.

Example: multicast a single message from this service to all other online
services.

```javascript
service.connections.forEach(function (socket) {
  socket.write('hallo message to you from me\n');
});
```

### service.close([callback])

This method will close the service and call `socket.end()` on all online
connections.

The optional `callback` arguments will be assigned as an `close` event handler.

```javascript
service.close(function () {
  // everything related to the service is now closed, unless there are other
  // this running node will automaticly shutdown this process.
});
```

### Event: connection

This event is emitted once a new socket becomes online, to detect the when
is offline use the socket `close` event:

Example: how to detect remote service shutdown

```javascript
service.on('connection', function (socket) {
  socket.once('close', function () {
    console.log('the service is most likely dead now');
  });
});
```

### Event: error

If an `error` occurres in the `server` or between establing a `TCP` connection
and the actuall `connection` event the `error` event will emit. Be aware that
if no `error` handler exist the error will be throwen.

Example: on one way to handle errors (but almost like just throwing)

```javascript
service.on('error', function (err) {
  console.error(err.stack);

  // oh no, an error we better just close the service
  service.close(function () {

    // if anything else is running, then it won't be shutdown gracefully
    process.exit(1);
  });
});
```

### Event: listening

Once the service is online this event will emit, note that calling
`service.address()` is quite useless if this event hasn't been emitted.

### Event: close

The service is now closed dude to a `service.close` call.

##License

**The software is license under "MIT"**

> Copyright (c) 2012 Andreas Madsen
>
> Permission is hereby granted, free of charge, to any person obtaining a copy
> of this software and associated documentation files (the "Software"), to deal
> in the Software without restriction, including without limitation the rights
> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
> copies of the Software, and to permit persons to whom the Software is
> furnished to do so, subject to the following conditions:
>
> The above copyright notice and this permission notice shall be included in
> all copies or substantial portions of the Software.
>
> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
> THE SOFTWARE.

本源码包内暂不包含可直接显示的源代码文件,请下载源码包。