udpsocket.js 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. var util = require('util');
  2. var handler = require('./common/handler');
  3. var protocol = require('pomelo-protocol');
  4. var Package = protocol.Package;
  5. var EventEmitter = require('events').EventEmitter;
  6. var logger = require('pomelo-logger').getLogger('pomelo', __filename);
  7. var ST_INITED = 0;
  8. var ST_WAIT_ACK = 1;
  9. var ST_WORKING = 2;
  10. var ST_CLOSED = 3;
  11. var Socket = function(id, socket, peer) {
  12. EventEmitter.call(this);
  13. this.id = id;
  14. this.socket = socket;
  15. this.peer = peer;
  16. this.host = peer.address;
  17. this.port = peer.port;
  18. this.remoteAddress = {
  19. ip: this.host,
  20. port: this.port
  21. };
  22. var self = this;
  23. this.on('package', function(pkg) {
  24. if(!!pkg) {
  25. pkg = Package.decode(pkg);
  26. handler(self, pkg);
  27. }
  28. });
  29. this.state = ST_INITED;
  30. };
  31. util.inherits(Socket, EventEmitter);
  32. module.exports = Socket;
  33. /**
  34. * Send byte data package to client.
  35. *
  36. * @param {Buffer} msg byte data
  37. */
  38. Socket.prototype.send = function(msg) {
  39. if(this.state !== ST_WORKING) {
  40. return;
  41. }
  42. if(msg instanceof String) {
  43. msg = new Buffer(msg);
  44. } else if(!(msg instanceof Buffer)) {
  45. msg = new Buffer(JSON.stringify(msg));
  46. }
  47. this.sendRaw(Package.encode(Package.TYPE_DATA, msg));
  48. };
  49. Socket.prototype.sendRaw = function(msg) {
  50. this.socket.send(msg, 0, msg.length, this.port, this.host, function(err, bytes) {
  51. if(!!err) {
  52. logger.error('send msg to remote with err: %j', err.stack);
  53. return;
  54. }
  55. });
  56. };
  57. Socket.prototype.sendForce = function(msg) {
  58. if(this.state === ST_CLOSED) {
  59. return;
  60. }
  61. this.sendRaw(msg);
  62. };
  63. Socket.prototype.handshakeResponse = function(resp) {
  64. if(this.state !== ST_INITED) {
  65. return;
  66. }
  67. this.sendRaw(resp);
  68. this.state = ST_WAIT_ACK;
  69. };
  70. Socket.prototype.sendBatch = function(msgs) {
  71. if(this.state !== ST_WORKING) {
  72. return;
  73. }
  74. var rs = [];
  75. for(var i=0; i<msgs.length; i++) {
  76. var src = Package.encode(Package.TYPE_DATA, msgs[i]);
  77. rs.push(src);
  78. }
  79. this.sendRaw(Buffer.concat(rs));
  80. };
  81. Socket.prototype.disconnect = function() {
  82. if(this.state === ST_CLOSED) {
  83. return;
  84. }
  85. this.state = ST_CLOSED;
  86. this.emit('disconnect', 'the connection is disconnected.');
  87. };