0 / 0 / 0
Регистрация: 24.04.2018
Сообщений: 30
1

Связь TCP сервер - сервер-клиент на node.js - браузер. нужна коррекция

27.07.2018, 10:08. Показов 3151. Ответов 2
Метки нет (Все метки)

Суть проблемы: написал по примерам программу, с помощью которой можно с браузера отправить команду на TCP сервер и получить ответ. Все работает. Но код очень кривой и, наверняка там есть что-то лишнее. Прошу подсказать как лучше исправить этого монстра. Очень уж мне он не нравится. Ну или как еще можно наладить связь TCP сервер - браузер?

руководствовался этим: https://habr.com/post/307744/

файл index.html

PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<html>
  <head>
    <meta charset="utf-8">
    <title>chat</title>
    <script src="socket.io.js"></script>
    <script src="https://code.jquery.com/jquery-3.1.0.min.js" charset="utf-8"></script>
    <script charset="utf-8">
    
      var HOST = 'localhost';
      var PORT = 3000; // Указываем порт на котором стоит сокет
      var socket = io.connect('http://' + HOST + ':' + PORT); // Тут мы объявляем "socket" (дальше мы будем с ним работать) 
 
      $(document).on('click', 'button', function(){ // Прослушка кнопки на клик
          var message = $('input').val(); // Все что в поле для ввода записываем в переменную
          socket.emit('message', message); // Отправляем событие 'message' на сервер  как переменная
          $('input').val(null); // Заполняем поле для ввода 'пустотой'
      });
 
      socket.on('messageToClients', function(msg){
          console.log('| => ' + msg); // Логгирование в консоль браузера
          $('textarea').val(msg +'\n');
      });
      
    </script>
  </head>
  <body>
    <textarea name="name" rows="8" cols="40"></textarea>
    <p></p>
    <input type="text" name="text" size="20">
    <button type="button" name="button">Отправить</button>
  </body>
</html>



файл cl_srv(по сути он является клиентом для TCP сервера( команду получаем -> устанавливаем связь -> получаем ответ -> связь разрываем), и HTTP сервером одновременно)

Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
var express = require('express'); // Подключаем express
var app = express();
var server = require('http').Server(app); // Подключаем http через app
var io = require('socket.io')(server); // Подключаем socket.io и указываем на сервер
var PORT = 3000; 
 
function ab2str(buf) {
  return String.fromCharCode.apply(null, new Uint16Array(buf));
}
 
server.listen(PORT); // Теперь мы можем подключиться к нашему серверу через localhost:3000 при запущенном скрипте
console.log('Script has been started...'); //Логгируем.
app.use(express.static(__dirname + '/public')); // Отправляет "статические" файлы из папки public при коннекте 
 
io.on('connection', function (socket) {
  socket.on('message', function(msg){ // Обработчик на событие 'message'
      console.log('Message: ' + msg);
 
      var net = require('net');
      var PPY_HOST = 'localhost';
      var PPY_PORT = 28015;
      var client = new net.Socket();
 
      client.connect(PPY_PORT, PPY_HOST, function() {
          console.log('Client connected to: ' + PPY_HOST + ':' + PPY_PORT);
          client.write(msg);
      });
 
      client.on('data', function(data) {    
          console.log('Client received: ' + data);
          io.sockets.emit('messageToClients', "srvr_out" + ab2str(data));
          if (data.toString().endsWith('exit')) {client.destroy();}
      });
 
      client.on('close', function() { console.log('Client closed');});
      client.on('error', function(err) {console.error(err);});
 
      io.sockets.emit('messageToClients', msg); // Отправляем всем сокетам событие 'messageToClients'
  });
});
Использовал node.js и модули в нем: express, http и socket.io
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.07.2018, 10:08
Ответы с готовыми решениями:

Связь TCP сервер-клиент
Включаю сервер на прослушку, соединение от клиента приходит - вызывается сигнал newConnection(), а...

Tcp ip клиент-сервер C++ сервер выводит мусор
server # include &lt;sys/types.h&gt; # include &lt;iostream&gt; # include &lt;winsock2.h&gt; # include...

TCP-сервер и TCP-клиент. Клиент не находит файл.
Всем привет! Решил изучать передачу данных по сети и начал с освоения примера, приведённого в...

Если сервер TCP то и клиент тоже должен быть TCP?
Я полный новичок И я так понимаю есть TCP client (Sockets), TCP server (Sockets), и ClientSocket...

2
1 / 1 / 0
Регистрация: 15.08.2018
Сообщений: 7
16.08.2018, 00:42 2
Если я правильно понял, то Ваше приложение на node.js используется как прокси-сервер и обеспечивает двунаправленную связь между клиентом и некой системой.
Для подобной реализации можно использовать httpreq для отправки данных из node.js-приложения к внешней системе (httpntlm если требуется доменная аутентификация) а принимать запросы с клиента (из браузера) стандартными средствами express: app.get() и app.post()
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
const express =     require('express');
const httpreq =     require('httpreq');
 
let app = express();
 
app.post('/FirstService', function (req, res) {
    httpreq.post('/DestinationService', {
        parameters: req.body
    }, function (err, _res) {
        if(err){
            //some error action
        }else{
            //happy
        }
    });
});
 
app.listen(3000);
это одна из многих возможных реализаций...
0
Coding is art
Эксперт JS
528 / 415 / 150
Регистрация: 04.09.2013
Сообщений: 1,051
22.08.2018, 01:06 3
каждый раз когда вы получаете сообщение "message" от клиента вы открываете новое соединение с сервером.
Лучше открыть соединение (keep-alive) вне сокетов и когда приходит "message" вы просто отправляете его на сервер (грубо говоря тот же сокет соединение) и не завершаете (не делаете destroy)

в остальном всё ок, если вам нужны сокеты помеж этих 2-х точек (в том плане что можно с браузера на прямую посылать сообщения, но тогда другие пользователи их не увидят)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.08.2018, 01:06
Помогаю со студенческими работами здесь

как создать TCP клиент, TCP сервер ? На С++
Очень нужна помощь!Как написать TCP клиент, TCP сервер. Например,клиент вводит строку с клавиатуры...

С ++ + qt клиент & сервер на node.js
всем дороу, нужно сделать клиент серверную аппликацию, клиент точно на плюсах и qt, сервер думаю...

TCP/IP клиент и сервер
Сервер # include &lt;sys/types.h&gt; # include &lt;iostream&gt; # include &lt;winsock2.h&gt; # include &lt;stdlib.h&gt;...

TCP IP Клиент - сервер
Добрый день, у меня есть 2 проекта - Клиент и Сервер Сервер import java.io.*; import java.net.*;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru