├── .gitignore ├── README.md ├── config └── config.json ├── package-lock.json ├── package.json ├── playground └── log_test.js ├── tcp_client.js ├── tcp_server.js ├── udp_client.js ├── udp_server.js └── util └── loggerTool.js /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | log -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Server Socket TCP UDP 2 | 3 | TCP and UDP servers and its clients 4 | 5 | ## Getting Started 6 | 7 | 8 | 9 | ### Prerequisites 10 | 11 | NodeJS 8 or above 12 | 13 | ``` 14 | Give examples 15 | ``` 16 | 17 | ### Installing 18 | 19 | Clone it from git and install npm packages 20 | 21 | ``` 22 | git clone https://github.com/rodrigoms2004/ServerSocketTCP_UDP.git 23 | cd ServerSocketTCP_UDP 24 | npm install 25 | 26 | ``` 27 | 28 | ## Acknowledgments 29 | 30 | * [sid24rane](https://gist.github.com/sid24rane) - Git Hub from sid24rane 31 | * [UDP Server and Client](https://gist.github.com/sid24rane/6e6698e93360f2694e310dd347a2e2eb) - Original UDP server and client 32 | 33 | 34 | 35 | 36 | ## Authors 37 | 38 | * **Rodrigo Moraes Silveira** 39 | *Git hub* - (https://github.com/rodrigoms2004) 40 | *E-mail* - rodrigoms2004@gmail.com 41 | 42 | ## License 43 | 44 | Copyfree 45 | -------------------------------------------------------------------------------- /config/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "serverHost": "0.0.0.0", 3 | "port": 21000, 4 | "timeout": 10000, 5 | "logdir": "log/server/" 6 | } -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ServerSocket", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "async": { 8 | "version": "2.6.2", 9 | "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz", 10 | "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==", 11 | "requires": { 12 | "lodash": "4.17.11" 13 | } 14 | }, 15 | "color": { 16 | "version": "3.0.0", 17 | "resolved": "https://registry.npmjs.org/color/-/color-3.0.0.tgz", 18 | "integrity": "sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w==", 19 | "requires": { 20 | "color-convert": "1.9.3", 21 | "color-string": "1.5.3" 22 | } 23 | }, 24 | "color-convert": { 25 | "version": "1.9.3", 26 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 27 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 28 | "requires": { 29 | "color-name": "1.1.3" 30 | } 31 | }, 32 | "color-name": { 33 | "version": "1.1.3", 34 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 35 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" 36 | }, 37 | "color-string": { 38 | "version": "1.5.3", 39 | "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", 40 | "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", 41 | "requires": { 42 | "color-name": "1.1.3", 43 | "simple-swizzle": "0.2.2" 44 | } 45 | }, 46 | "colornames": { 47 | "version": "1.1.1", 48 | "resolved": "https://registry.npmjs.org/colornames/-/colornames-1.1.1.tgz", 49 | "integrity": "sha1-+IiQMGhcfE/54qVZ9Qd+t2qBb5Y=" 50 | }, 51 | "colors": { 52 | "version": "1.3.3", 53 | "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.3.tgz", 54 | "integrity": "sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg==" 55 | }, 56 | "colorspace": { 57 | "version": "1.1.1", 58 | "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.1.tgz", 59 | "integrity": "sha512-pI3btWyiuz7Ken0BWh9Elzsmv2bM9AhA7psXib4anUXy/orfZ/E0MbQwhSOG/9L8hLlalqrU0UhOuqxW1YjmVw==", 60 | "requires": { 61 | "color": "3.0.0", 62 | "text-hex": "1.0.0" 63 | } 64 | }, 65 | "core-util-is": { 66 | "version": "1.0.2", 67 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 68 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 69 | }, 70 | "cycle": { 71 | "version": "1.0.3", 72 | "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", 73 | "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=" 74 | }, 75 | "diagnostics": { 76 | "version": "1.1.1", 77 | "resolved": "https://registry.npmjs.org/diagnostics/-/diagnostics-1.1.1.tgz", 78 | "integrity": "sha512-8wn1PmdunLJ9Tqbx+Fx/ZEuHfJf4NKSN2ZBj7SJC/OWRWha843+WsTjqMe1B5E3p28jqBlp+mJ2fPVxPyNgYKQ==", 79 | "requires": { 80 | "colorspace": "1.1.1", 81 | "enabled": "1.0.2", 82 | "kuler": "1.0.1" 83 | } 84 | }, 85 | "enabled": { 86 | "version": "1.0.2", 87 | "resolved": "https://registry.npmjs.org/enabled/-/enabled-1.0.2.tgz", 88 | "integrity": "sha1-ll9lE9LC0cX0ZStkouM5ZGf8L5M=", 89 | "requires": { 90 | "env-variable": "0.0.5" 91 | } 92 | }, 93 | "env-variable": { 94 | "version": "0.0.5", 95 | "resolved": "https://registry.npmjs.org/env-variable/-/env-variable-0.0.5.tgz", 96 | "integrity": "sha512-zoB603vQReOFvTg5xMl9I1P2PnHsHQQKTEowsKKD7nseUfJq6UWzK+4YtlWUO1nhiQUxe6XMkk+JleSZD1NZFA==" 97 | }, 98 | "fast-safe-stringify": { 99 | "version": "2.0.6", 100 | "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.6.tgz", 101 | "integrity": "sha512-q8BZ89jjc+mz08rSxROs8VsrBBcn1SIw1kq9NjolL509tkABRk9io01RAjSaEv1Xb2uFLt8VtRiZbGp5H8iDtg==" 102 | }, 103 | "fecha": { 104 | "version": "2.3.3", 105 | "resolved": "https://registry.npmjs.org/fecha/-/fecha-2.3.3.tgz", 106 | "integrity": "sha512-lUGBnIamTAwk4znq5BcqsDaxSmZ9nDVJaij6NvRt/Tg4R69gERA+otPKbS86ROw9nxVMw2/mp1fnaiWqbs6Sdg==" 107 | }, 108 | "file-stream-rotator": { 109 | "version": "0.4.1", 110 | "resolved": "https://registry.npmjs.org/file-stream-rotator/-/file-stream-rotator-0.4.1.tgz", 111 | "integrity": "sha512-W3aa3QJEc8BS2MmdVpQiYLKHj3ijpto1gMDlsgCRSKfIUe6MwkcpODGPQ3vZfb0XvCeCqlu9CBQTN7oQri2TZQ==", 112 | "requires": { 113 | "moment": "2.24.0" 114 | } 115 | }, 116 | "inherits": { 117 | "version": "2.0.3", 118 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 119 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 120 | }, 121 | "is-arrayish": { 122 | "version": "0.3.2", 123 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", 124 | "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" 125 | }, 126 | "is-stream": { 127 | "version": "1.1.0", 128 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", 129 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" 130 | }, 131 | "isarray": { 132 | "version": "1.0.0", 133 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 134 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 135 | }, 136 | "kuler": { 137 | "version": "1.0.1", 138 | "resolved": "https://registry.npmjs.org/kuler/-/kuler-1.0.1.tgz", 139 | "integrity": "sha512-J9nVUucG1p/skKul6DU3PUZrhs0LPulNaeUOox0IyXDi8S4CztTHs1gQphhuZmzXG7VOQSf6NJfKuzteQLv9gQ==", 140 | "requires": { 141 | "colornames": "1.1.1" 142 | } 143 | }, 144 | "lodash": { 145 | "version": "4.17.11", 146 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", 147 | "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" 148 | }, 149 | "logform": { 150 | "version": "2.1.2", 151 | "resolved": "https://registry.npmjs.org/logform/-/logform-2.1.2.tgz", 152 | "integrity": "sha512-+lZh4OpERDBLqjiwDLpAWNQu6KMjnlXH2ByZwCuSqVPJletw0kTWJf5CgSNAUKn1KUkv3m2cUz/LK8zyEy7wzQ==", 153 | "requires": { 154 | "colors": "1.3.3", 155 | "fast-safe-stringify": "2.0.6", 156 | "fecha": "2.3.3", 157 | "ms": "2.1.1", 158 | "triple-beam": "1.3.0" 159 | } 160 | }, 161 | "moment": { 162 | "version": "2.24.0", 163 | "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", 164 | "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==" 165 | }, 166 | "ms": { 167 | "version": "2.1.1", 168 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 169 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 170 | }, 171 | "object-hash": { 172 | "version": "1.3.1", 173 | "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.3.1.tgz", 174 | "integrity": "sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==" 175 | }, 176 | "one-time": { 177 | "version": "0.0.4", 178 | "resolved": "https://registry.npmjs.org/one-time/-/one-time-0.0.4.tgz", 179 | "integrity": "sha1-+M33eISCb+Tf+T46nMN7HkSAdC4=" 180 | }, 181 | "process-nextick-args": { 182 | "version": "2.0.0", 183 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", 184 | "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" 185 | }, 186 | "readable-stream": { 187 | "version": "3.3.0", 188 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.3.0.tgz", 189 | "integrity": "sha512-EsI+s3k3XsW+fU8fQACLN59ky34AZ14LoeVZpYwmZvldCFo0r0gnelwF2TcMjLor/BTL5aDJVBMkss0dthToPw==", 190 | "requires": { 191 | "inherits": "2.0.3", 192 | "string_decoder": "1.2.0", 193 | "util-deprecate": "1.0.2" 194 | } 195 | }, 196 | "safe-buffer": { 197 | "version": "5.1.2", 198 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 199 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 200 | }, 201 | "semver": { 202 | "version": "5.7.0", 203 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", 204 | "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" 205 | }, 206 | "simple-swizzle": { 207 | "version": "0.2.2", 208 | "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", 209 | "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", 210 | "requires": { 211 | "is-arrayish": "0.3.2" 212 | } 213 | }, 214 | "stack-trace": { 215 | "version": "0.0.10", 216 | "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", 217 | "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" 218 | }, 219 | "string_decoder": { 220 | "version": "1.2.0", 221 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.2.0.tgz", 222 | "integrity": "sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w==", 223 | "requires": { 224 | "safe-buffer": "5.1.2" 225 | } 226 | }, 227 | "text-hex": { 228 | "version": "1.0.0", 229 | "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", 230 | "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" 231 | }, 232 | "triple-beam": { 233 | "version": "1.3.0", 234 | "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", 235 | "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" 236 | }, 237 | "util-deprecate": { 238 | "version": "1.0.2", 239 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 240 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 241 | }, 242 | "winston": { 243 | "version": "3.2.1", 244 | "resolved": "https://registry.npmjs.org/winston/-/winston-3.2.1.tgz", 245 | "integrity": "sha512-zU6vgnS9dAWCEKg/QYigd6cgMVVNwyTzKs81XZtTFuRwJOcDdBg7AU0mXVyNbs7O5RH2zdv+BdNZUlx7mXPuOw==", 246 | "requires": { 247 | "async": "2.6.2", 248 | "diagnostics": "1.1.1", 249 | "is-stream": "1.1.0", 250 | "logform": "2.1.2", 251 | "one-time": "0.0.4", 252 | "readable-stream": "3.3.0", 253 | "stack-trace": "0.0.10", 254 | "triple-beam": "1.3.0", 255 | "winston-transport": "4.3.0" 256 | } 257 | }, 258 | "winston-compat": { 259 | "version": "0.1.4", 260 | "resolved": "https://registry.npmjs.org/winston-compat/-/winston-compat-0.1.4.tgz", 261 | "integrity": "sha512-mMEfFsSm6GmkFF+f4/0UJtG4N1vSaczGmXLVJYmS/+u2zUaIPcw2ZRuwUg2TvVBjswgiraN+vNnAG8z4fRUZ4w==", 262 | "requires": { 263 | "cycle": "1.0.3", 264 | "logform": "1.10.0", 265 | "triple-beam": "1.3.0" 266 | }, 267 | "dependencies": { 268 | "logform": { 269 | "version": "1.10.0", 270 | "resolved": "https://registry.npmjs.org/logform/-/logform-1.10.0.tgz", 271 | "integrity": "sha512-em5ojIhU18fIMOw/333mD+ZLE2fis0EzXl1ZwHx4iQzmpQi6odNiY/t+ITNr33JZhT9/KEaH+UPIipr6a9EjWg==", 272 | "requires": { 273 | "colors": "1.3.3", 274 | "fast-safe-stringify": "2.0.6", 275 | "fecha": "2.3.3", 276 | "ms": "2.1.1", 277 | "triple-beam": "1.3.0" 278 | } 279 | } 280 | } 281 | }, 282 | "winston-daily-rotate-file": { 283 | "version": "3.8.0", 284 | "resolved": "https://registry.npmjs.org/winston-daily-rotate-file/-/winston-daily-rotate-file-3.8.0.tgz", 285 | "integrity": "sha512-k3usQWe2Iqudi4Ys/tAiGJODSXvqMF+esOIiMJRpWNYnrbuAXBccpaODttDP3GiGVx3H8tE/pS8K3CvkNMqXiw==", 286 | "requires": { 287 | "file-stream-rotator": "0.4.1", 288 | "object-hash": "1.3.1", 289 | "semver": "5.7.0", 290 | "triple-beam": "1.3.0", 291 | "winston-compat": "0.1.4", 292 | "winston-transport": "4.3.0" 293 | } 294 | }, 295 | "winston-transport": { 296 | "version": "4.3.0", 297 | "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.3.0.tgz", 298 | "integrity": "sha512-B2wPuwUi3vhzn/51Uukcao4dIduEiPOcOt9HJ3QeaXgkJ5Z7UwpBzxS4ZGNHtrxrUvTwemsQiSys0ihOf8Mp1A==", 299 | "requires": { 300 | "readable-stream": "2.3.6", 301 | "triple-beam": "1.3.0" 302 | }, 303 | "dependencies": { 304 | "readable-stream": { 305 | "version": "2.3.6", 306 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 307 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 308 | "requires": { 309 | "core-util-is": "1.0.2", 310 | "inherits": "2.0.3", 311 | "isarray": "1.0.0", 312 | "process-nextick-args": "2.0.0", 313 | "safe-buffer": "5.1.2", 314 | "string_decoder": "1.1.1", 315 | "util-deprecate": "1.0.2" 316 | } 317 | }, 318 | "string_decoder": { 319 | "version": "1.1.1", 320 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 321 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 322 | "requires": { 323 | "safe-buffer": "5.1.2" 324 | } 325 | } 326 | } 327 | } 328 | } 329 | } 330 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ServerSocket", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "dependencies": { 13 | "moment": "^2.24.0", 14 | "winston": "^3.2.1", 15 | "winston-daily-rotate-file": "^3.8.0" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /playground/log_test.js: -------------------------------------------------------------------------------- 1 | 2 | const winston = require('winston') 3 | 4 | const levels = { 5 | error: 0, 6 | warn: 1, 7 | info: 2, 8 | verbose: 3, 9 | debug: 4, 10 | silly: 5 11 | } 12 | 13 | const logger = winston.createLogger({ 14 | level: 'info', 15 | format: winston.format.json(), 16 | defaultMeta: { service: 'user-service' }, 17 | transports: [ 18 | // 19 | // - Write to all logs with level `info` and below to `combined.log` 20 | // - Write all logs error (and below) to `error.log`. 21 | // 22 | 23 | new winston.transports.File({ filename: 'log/error.log', level: 'error' }), 24 | new winston.transports.File({ filename: 'log/combined.log' }) 25 | ] 26 | }); 27 | 28 | // 29 | // If we're not in production then log to the `console` with the format: 30 | // `${info.level}: ${info.message} JSON.stringify({ ...rest }) ` 31 | // 32 | if (process.env.NODE_ENV !== 'production') { 33 | logger.add(new winston.transports.Console({ 34 | format: winston.format.simple() 35 | })); 36 | } 37 | 38 | logger.log({ 39 | level: 'info', 40 | message: 'Hello distributed log files!', 41 | timestamp: new Date().toJSON() 42 | }); 43 | 44 | logger.info('Hello again distributed logs'); 45 | 46 | logger.error('Error log') 47 | logger.warn('Warning log') 48 | -------------------------------------------------------------------------------- /tcp_client.js: -------------------------------------------------------------------------------- 1 | const net = require('net') 2 | const conf = require('./config/config') 3 | 4 | const client = new net.Socket() 5 | const host = '127.0.0.1' 6 | 7 | client.connect(conf.port, host, function() { 8 | console.log('Connected') 9 | client.write("Hello From Client " + client.address().address) 10 | }) 11 | 12 | client.on('data', data => { 13 | console.log('Received: ' + data) 14 | client.destroy() 15 | }) 16 | 17 | client.on('close', () => { 18 | console.log('Connection closed') 19 | }) -------------------------------------------------------------------------------- /tcp_server.js: -------------------------------------------------------------------------------- 1 | const net = require('net') 2 | const conf = require('./config/config') 3 | 4 | const { 5 | log 6 | } = require('./util/loggerTool') 7 | 8 | const server = net.createServer() 9 | 10 | // emits when any error occurs 11 | server.on('error', (error) => { 12 | log("tcp_server", "error", error) 13 | server.close() 14 | }) 15 | 16 | const sockets = [] 17 | server.on('connection', sock => { 18 | log("tcp_server", "info", `Connected at ${sock.remoteAddress}:${sock.remotePort}`) 19 | 20 | sockets.push(sock) 21 | 22 | sock.on('data', data => { 23 | 24 | log("tcp_server", "info", data.toString() + ` | Received ${sock.bytesRead} bytes from ${sock.remoteAddress}:${sock.remotePort}`) 25 | 26 | let timestp = new Date() 27 | const response = { 28 | description: 'TCP PORT TEST BY RMS Math', 29 | serverPort: conf.port, 30 | timestamp: timestp.toJSON(), 31 | received: { 32 | message: data.toString(), 33 | fromIP: sock.remoteAddress, 34 | fromPort: sock.remotePort 35 | } 36 | } 37 | const dataBuffer = Buffer.from(JSON.stringify(response)) 38 | 39 | // Write the data back to all the connected, the client will receive it as data from the server 40 | sockets.forEach((sock, index, array) => { 41 | sock.write(dataBuffer) 42 | }) 43 | }) 44 | 45 | // Add a 'close' event handler to this instance of socket 46 | sock.on('close', data => { 47 | let index = sockets.findIndex( o => { 48 | return o.remoteAddress === sock.remoteAddress && o.remotePort === sock.remotePort 49 | }) 50 | 51 | if (index !== -1) { 52 | sockets.splice(index, 1) 53 | } 54 | log("tcp_server", "info", `Socket closed with ${sock.remoteAddress}:${sock.remotePort}`) 55 | }) // end sock.on 56 | }) 57 | 58 | 59 | // server.listen(conf.port, conf.serverHost, () => { 60 | server.listen(conf.port, conf.serverHost, () => { 61 | const address = server.address() 62 | const port = address.port 63 | const family = address.family 64 | const ipaddr = address.address 65 | 66 | log("tcp_server", "info", 'Server is listening at port ' + port) 67 | log("tcp_server", "info", 'Server ip :' + ipaddr) 68 | log("tcp_server", "info", 'Server is IP4/IP6 : ' + family) 69 | }) // server.listen() 70 | -------------------------------------------------------------------------------- /udp_client.js: -------------------------------------------------------------------------------- 1 | // Example adapted from https://gist.github.com/sid24rane/6e6698e93360f2694e310dd347a2e2eb 2 | // https://gist.github.com/sid24rane 3 | 4 | const udp = require('dgram') 5 | const conf = require('./config/config') 6 | 7 | // creating a client socket 8 | const client = udp.createSocket('udp4') 9 | 10 | //buffer msg 11 | const data = Buffer.from('MSG from UDP client') 12 | 13 | client.on('message', (msg, info) => { 14 | console.log('Data received from server : ' + msg.toString()) 15 | console.log('Received %d bytes from %s:%d\n', msg.length, info.address, info.port) 16 | }) 17 | 18 | //sending msg 19 | client.send(data, conf.port, conf.host, error => { 20 | if (error) { 21 | console.log(error) 22 | client.close() 23 | } else { 24 | console.log('Data sent !!!') 25 | } 26 | }) 27 | 28 | const data1 = Buffer.from('hello') 29 | const data2 = Buffer.from('world') 30 | 31 | //sending multiple msg 32 | client.send([ data1, data2 ], conf.port, conf.host, error => { 33 | 34 | if(error){ 35 | console.log(error) 36 | client.close() 37 | }else{ 38 | console.log('Data sent !!!') 39 | } 40 | }) 41 | 42 | setTimeout( () => { 43 | client.close() 44 | },conf.timeout) -------------------------------------------------------------------------------- /udp_server.js: -------------------------------------------------------------------------------- 1 | // Example adapted from https://gist.github.com/sid24rane/6e6698e93360f2694e310dd347a2e2eb 2 | // https://gist.github.com/sid24rane 3 | 4 | const udp = require('dgram') 5 | const conf = require('./config/config') 6 | 7 | const { 8 | log 9 | } = require('./util/loggerTool') 10 | 11 | // --------------------creating a udp server -------------------- 12 | 13 | // creating a udp server 14 | const server = udp.createSocket('udp4') 15 | 16 | // emits when any error occurs 17 | server.on('error', (error) => { 18 | log("udp_server", "error", error) 19 | server.close() 20 | }) 21 | 22 | // emits on new datagram msg 23 | server.on('message', (msg,info) => { 24 | log("udp_server", "info", msg.toString() + ` | Received ${msg.length} bytes from ${info.address}:${info.port}`) 25 | 26 | let timestp = new Date() 27 | const response = { 28 | description: 'UDP PORT TEST BY RMS Math', 29 | serverPort: conf.port, 30 | timestamp: timestp.toJSON(), 31 | received: { 32 | message: msg.toString(), 33 | fromIP: info.address, 34 | fromPort: info.port 35 | } 36 | } 37 | const data = Buffer.from(JSON.stringify(response)) 38 | 39 | //sending msg 40 | server.send(data, info.port, info.address, (error, bytes) => { 41 | if(error){ 42 | log("udp_server", "error", error) 43 | client.close() 44 | } else { 45 | log("udp_server", "info", 'Data sent !!!') 46 | } 47 | }) 48 | }) // end server.on 49 | 50 | 51 | //emits when socket is ready and listening for datagram msgs 52 | server.on('listening', () => { 53 | const address = server.address() 54 | const port = address.port 55 | const family = address.family 56 | const ipaddr = address.address 57 | 58 | log("udp_server", "info", 'Server is listening at port ' + port) 59 | log("udp_server", "info", 'Server ip :' + ipaddr) 60 | log("udp_server", "info", 'Server is IP4/IP6 : ' + family) 61 | }) 62 | 63 | //emits after the socket is closed using socket.close() 64 | server.on('close', () => { 65 | log("udp_server", "info", 'Socket is closed !') 66 | }) 67 | 68 | server.bind(conf.port) 69 | -------------------------------------------------------------------------------- /util/loggerTool.js: -------------------------------------------------------------------------------- 1 | 2 | const winston = require('winston') 3 | const moment = require('moment') 4 | require('winston-daily-rotate-file') 5 | const conf = require('../config/config') 6 | 7 | const transports = [ 8 | new winston.transports.DailyRotateFile({ 9 | name: 'logs', 10 | filename: conf.logdir + 'access%DATE%.log', 11 | maxSize: '1000k', 12 | maxFiles: '15d', 13 | zippedArchive: false 14 | }), 15 | new winston.transports.DailyRotateFile({ 16 | level: 'error', 17 | name: 'logs', 18 | filename: conf.logdir + 'error%DATE%.log', 19 | maxSize: '1000k', 20 | maxFiles: '15d', 21 | zippedArchive: false 22 | }), 23 | new winston.transports.Console({ 24 | colorize: true 25 | }) 26 | ] 27 | 28 | const logger = winston.createLogger({ 29 | // format: winston.format.json(), 30 | // defaultMeta: { timestamp: new Date() }, 31 | transports: transports 32 | }) 33 | 34 | 35 | // if (process.env.NODE_ENV !== 'production') { 36 | // logger.add(new winston.transports.Console({ format: winston.format.simple() })) 37 | // } 38 | 39 | const log = async (service, level, msg) => { 40 | logger.log({ 41 | timestamp: moment().format('YYYY-MM-DD HH:mm:ss.SSSS'), 42 | service: service, 43 | level: level, 44 | message: msg 45 | }) 46 | } // end infoLog 47 | 48 | 49 | module.exports = { log } 50 | --------------------------------------------------------------------------------