Несколько сообщений сокетов, сжатых в одном - PullRequest
0 голосов
/ 19 октября 2018

Я пытаюсь создать программу, которая связывается с локальным NodeJS с сокет-сервером C #.

Вот код, который я использую

NodeJS

const net = require('net');

class Socket {

    constructor(ip, port) {
        this.ip = ip;
        this.port = port;
    }

    initClient() {
        const client = new net.Socket();

        client.connect(this.port, this.ip, () => {
            console.log(`Connected to ${this.ip}:${this.port}`);
        });

        client.on("data", async data => {
            console.log("Received '" + data.toString() + "'");
            setTimeout(function () {
                client.write("OK");
            }, 3500);

        });

        client.on('close', () => {
            console.log(`Connection closed`);
        });

    }
}

let socket = new Socket("HOST", 1337);
socket.initClient();

C #

Главный класс

List<String> toSendList = new List<String>();
toSendList.Add("TEST 1");
toSendList.Add("TEST 2");
toSendList.Add("TEST 3");
toSendList.Add("TEST 4");
toSendList.Add("TEST 5");

Parallel.ForEach(toSendList, new ParallelOptions { MaxDegreeOfParallelism = 5 }, delegate (string content)
{

    logger.WriteLine("Result => " + socket.SendAndWaitResult(content));

});

Класс сокета сервера

public Server(int port)
{

    IPEndPoint ip = new IPEndPoint(IPAddress.Any, port);
    Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

    socket.Bind(ip);
    socket.Listen(10);

    client = socket.Accept();

}

public String SendAndWaitResult(String content)
{

    byte[] data = new byte[1024];
    data = Encoding.ASCII.GetBytes(content);
    client.Send(data, data.Length, SocketFlags.None);

    data = new byte[1024];
    int receivedDataLength = client.Receive(data);
    string response = Encoding.ASCII.GetString(data, 0, receivedDataLength);

    logger.WriteLine("[DEBUG] Received : '" + response + "'");

    return response;

}

И когда я запускаю обе программы,вот что я получаю

NodeJS Output

Connected to HOST:1337
Received 'TEST 1'
Received 'TEST 2TEST 3TEST 4TEST 5'

C # Output

[DEBUG] Received : 'OK'
Result => OK
[DEBUG] Received : 'OK'
Result => OK

Кто-то имеет представление опочему все сообщения после первого сжимаются в одно большое сообщение?

1 Ответ

0 голосов
/ 20 октября 2018

Причина, скорее всего, следующая ( source C # API Send () ):

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

Таким образом, даже если Send вызывается отдельно для каждой записи в Списке, операционная система может неопределенно объединить их в один сегмент TCP.

Если выхотел бы различать отдельные элементы данных, вы должны добавить разделитель к передаче.Например, используйте перевод строки (\n) после каждого элемента и разбивайте их на стороне узла.

client.on('data', data => data.toString().split('\n').forEach(item => {
  console.log(`Received '${item}'`);
  setTimeout(() => client.write('OK'), 3500);
}));

Если размер отдельной передачи не помещается в один сегмент TCP, дополнительная буферизацияполученные сегменты могут быть необходимы на стороне Node.js.

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