Два приложения могут слушать тот же порт?

Вы можете использовать это: он перебирает свойство строки и получает тип и стоимость платежа. Если тип платежа уже находится в объекте, он добавляется к нему, иначе он создает свойство.

var obj={  
    "total_rows":59,
    "offset":0,
    "rows":[  
       {  
          "key":"PAY_2019-01-11T12:18:52.085Z",
          "id":"PAY_2019-01-11T12:18:52.085Z",
          "value":110,
          "doc":{  
             "paymentStatus":true,
             "paymentOption":"card",
             "amount":110,
             "tenderedTotal":110,
             "time":"2019-01-11T12:18:52.085Z",
             "orderId":"ORD_2019-01-11T12:18:52.085Z",
             "type":"payment",
             "_id":"PAY_2019-01-11T12:18:52.085Z",
             "_rev":"1-9fdc73a415914311a80db1727fbc593b"
          }
       },
       {  
          "key":"PAY_2019-01-11T16:27:29.553Z",
          "id":"PAY_2019-01-11T16:27:29.553Z",
          "value":66,
          "doc":{  
             "paymentStatus":true,
             "paymentOption":"cash",
             "amount":66,
             "tenderedTotal":66,
             "time":"2019-01-11T16:27:29.553Z",
             "orderId":"ORD_2019-01-11T16:27:29.553Z",
             "type":"payment",
             "_id":"PAY_2019-01-11T16:27:29.553Z",
             "_rev":"1-a58e3811d11c4ca3a92bd1e206e6e0f3"
          }
       },
       {  
          "key":"PAY_2019-01-11T18:12:13.716Z",
          "id":"PAY_2019-01-11T18:12:13.716Z",
          "value":60,
          "doc":{  
             "paymentStatus":true,
             "paymentOption":"account",
             "amount":60,
             "tenderedTotal":152,
             "time":"2019-01-11T18:12:13.716Z",
             "orderId":"ORD_2019-01-11T18:12:13.716Z",
             "type":"payment",
             "fromCustomerAccount":true,
             "customerPayment":false,
             "grandTotal":60,
             "customer":{  
                "type":"account",
                "account_type":"customer",
                "fname":"Mukopaje",
                "lname":"Singogo",
                "phone":"974776247",
                "email":"mukopaje@gmail.com",
                "region":"Other",
                "city":"Lusaka",
                "balance":0,
                "status":true,
                "index":0,
                "_id":"CST_2019-01-03T11:27:22.924Z",
                "_rev":"4-9453c05f151242a39bc5511323bbb820"
             },
             "customerPaid":152,
             "customer_id":"CST_2019-01-03T11:27:22.924Z",
             "credeb":"debit",
             "_id":"PAY_2019-01-11T18:12:13.716Z",
             "_rev":"1-0486777aaf1444bdaa8bcd35dd18c1d9"
          }
       }
    ]
 }
 var a=obj.rows;
 var k={};
 a.forEach((e)=>{
 if(!k.hasOwnProperty(e.doc.paymentOption))
 {
k[e.doc.paymentOption]=0;    
}
if(k.hasOwnProperty(e.doc.paymentOption))
{
    k[e.doc.paymentOption]=Number(k[e.doc.paymentOption])+Number(e.value);
}
})
 console.log(k)

262
задан ROMANIA_engineer 10 November 2016 в 10:34
поделиться

4 ответа

Ответ зависит от того, какая ОС рассматривается. В общем, хотя:

Для TCP нет. У вас может быть только одно приложение, прослушивающее один и тот же порт одновременно. Теперь, если у вас есть 2 сетевые карты, вы можете настроить одно приложение для прослушивания на первом IP-адресе, а второе на втором IP-адресе, используя один и тот же номер порта.

Для UDP (Multicast) несколько приложений могут подписаться на один и тот же порт.

Редактировать: Начиная с ядра Linux 3.9 и новее, поддержка нескольких приложений, прослушивающих один и тот же порт, была добавлена ​​с помощью параметра SO_REUSEPORT . Более подробная информация доступна в этой статье lwn.net.

235
ответ дан 23 November 2019 в 02:34
поделиться

Просто чтобы поделиться тем, что упомянул @jnewton. Я запустил nginx и встроенный процесс tomcat на моем Mac. Я вижу, как процесс запускается на 8080.

LT<XXXX>-MAC:~ b0<XXX>$ sudo netstat -anp tcp | grep LISTEN
tcp46      0      0  *.8080                 *.*                    LISTEN     
tcp4       0      0  *.8080                 *.*                    LISTEN   
0
ответ дан 23 November 2019 в 02:34
поделиться

В принципе, нет.

Это не высечено на камне; но так написаны все API: приложение открывает порт, получает его дескриптор, а ОС уведомляет его (через этот дескриптор), когда приходит клиентское соединение (или пакет в случае UDP).

  • В Linux и BSD (по крайней мере) вы можете настроить правила «переназначения», которые перенаправляют пакеты с «видимого» порта на другой (где приложения слушают), в соответствии с любыми критериями, связанными с сетью (возможно, сеть происхождения , или некоторые простые формы балансировки нагрузки).
47
ответ дан 23 November 2019 в 02:34
поделиться

Нет. Только одно приложение может связываться с портом за раз, и поведение при принудительном связывании не определено.

С многоадресными сокетами - что звучит совсем не так, как вы хотите - более одного приложения могут связываться с портом, если SO_REUSEADDR установлен в параметрах каждого сокета.

Вы можете сделать это, написав "master" ", который принимает и обрабатывает все соединения, а затем передает их двум вашим приложениям, которым необходимо прослушивать один и тот же порт. Это подход, который используют веб-серверы и подобные, поскольку многим процессам необходимо прослушивать 80.

Помимо этого, мы углубляемся в особенности - вы отметили и TCP, и UDP, что это такое? Кроме того, на какой платформе?

затем передает их двум вашим приложениям, которым необходимо прослушивать один и тот же порт. Это подход, который используют веб-серверы и подобные, поскольку многим процессам необходимо прослушивать 80.

Помимо этого, мы углубляемся в особенности - вы отметили и TCP, и UDP, что это такое? Кроме того, на какой платформе?

затем передает их двум вашим приложениям, которым необходимо прослушивать один и тот же порт. Это подход, который используют веб-серверы и подобные, поскольку многим процессам необходимо прослушивать 80.

Помимо этого, мы углубляемся в особенности - вы отметили и TCP, и UDP, что это такое? Кроме того, на какой платформе?

18
ответ дан 23 November 2019 в 02:34
поделиться