как использовать http сервер и сокет соединение - PullRequest
1 голос
/ 05 марта 2020

Я использую http-сервер с сокетным соединением. Ответ http-запроса идет, когда клиент отвечает на сокетное соединение. В настоящее время я делаю это, сохраняя res в глобальном объекте, который, я думаю, не является правильным методом, какой является правильным методом сделать это.

const app = require('express')()
bodyParser = require('body-parser')
app.use(bodyParser.json())
const net = require('net');
var client;
var res1,currentReq;

//----------------------------------------------------------------------------
// http requests listener
//----------------------------------------------------------------------------

app.listen(8001, () => console.log('Http server listening on port 8001'));

//----------------------------------------------------------------------------
// http requests handling
//----------------------------------------------------------------------------

app.post('/makeCall', (req, res) => {
        console.log('sd' + req.body)
        res1 = res;
        currentReq='makeCall';
        client.write("something");

});

//----------------------------------------------------------------------------
// Establishing tcp connection for incoming requests
//----------------------------------------------------------------------------

var server = net.createServer(function(connection) {
   console.log ('client has connected successfully!');
   client = connection;
   client.on('data',function(data){
   switch(currentReq) 
   {
       case 'makeCall' :
                    res1.end(data);
                    break;
   }

  });
});


//----------------------------------------------------------------------------
// listener for tcp connections
//----------------------------------------------------------------------------

server.listen(8000, function() {
   console.log('server for localhost is listening on port 8000');
});

1 Ответ

1 голос
/ 06 марта 2020

На основании нашего обсуждения в комментариях, вот пример того, как можно сделать это, используя socket.io.

Используя настройку socket.io, браузер подключится к HTTP-серверу для выполнения запросов HTTP GET AND POST, например, к /makeCall. Браузер также подключится к тому же HTTP-серверу , чтобы открыть сокет. Браузер сначала подключится по HTTP, затем отправит специальное рукопожатие, которое преобразует соединение в WebSocket.

Я до сих пор не уверен, что понимаю ваш вариант использования, поэтому, возможно, это решение не подходит, но вот общие настройки того, как оно может выглядеть.

const app = require('express')()
const bodyParser = require('body-parser')
const server = require('http').Server(app);
const io = require('socket.io')(server);
const cookieSession = require('cookie-session')

app.use(bodyParser.json())
app.use(cookieSession({
  keys: ['secret key', 'another one', 'a third one'],
  maxAge: 24 * 60 * 60 * 1000 // cookie max-age : 24 hours
}))


//----------------------------------------------------------------------------
// http requests listener
//----------------------------------------------------------------------------
server.listen(8001, () => console.log('Http server listening on port 8001'));
// WARNING: app.listen() will NOT work here! per socket.io docks

const idToSocketMap = new Map();

//----------------------------------------------------------------------------
// http requests handling
//----------------------------------------------------------------------------
app.post('/makeCall', (req, res) => {
  console.log('sd' + req.body)
  if (!req.session.id) {
    req.session.id = generateId();
  }

  //this may not be necessary, see below
  req.session.currentReq = 'makeCall';

  const socket = idToSocketMap.get(req.session.id)
  if (socket) { //if a socket connected for that id
    socket.emit("makeCall", "an argument/parameter", "something");
  }
});

//----------------------------------------------------------------------------
// Establishing websocket connection for incoming requests
//----------------------------------------------------------------------------
io.on('connection', (socket) => {
  //"socket" is now what would have been called "client" in old code

  //get the id from the session cookie of the http request
  const id = socket.request.session.id;
  //put the socket in the map
  idToSocketMap.set(id, socket);
  //remove the socket from the map on disconnect
  socket.on('disconnect', () => idToSocketMap.delete(id));

  console.log('client has connected successfully!');

  socket.on('makeCall', (firstParameter, something) => {
    // It's still not possible to send anything back to an HTTP connection
    // but we may do some things and reply here
    const someData = getSomeData();
    socket.emit('makeCallResponse', 'someData');
  });
});

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...