java threaded socket: какой поток получает пакет?

#java #multithreading #sockets #p2p

#java #многопоточность #сокеты #p2p

Вопрос:

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

Ответ №1:

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

Ответ №2:

Вам понадобится пользовательский пакет, чтобы определить, какого рода «пакет» это. Например, сериализованный класс, который реализует интерфейс, который знает, какой это тип пакета. Пример грубой структуры.

 Packet implements Serializable{
 enum type;
 Object data

 public setdata
 public getdata
 ...
 ...
}
 

Это можно сделать двумя способами.

1 — Сделайте то, что вы предложили. Используйте один поток для обработки как файлов, так и сообщений в зависимости от типа пакета.

2 . Используйте два отдельных потока. Но создайте обработчик для доставки пакета для передачи соответствующему потоку в зависимости от типа пакета.

Редактировать:

О, как упоминал Джим, вам понадобится другой поток для управления сокетом.

Ответ №3:

У меня есть два отдельных потока для получения файлов и сообщений.

Почему?

Проблема в том, как указать, какой поток должен получать поступающий пакет.

Ваша первая проблема заключается в том, что в TCP API нет «пакетов». Он предоставляет байтовый поток. Любое пакетирование полностью зависит от вас с обоих концов.

Ваша вторая проблема заключается в том, что поток, который вошел read() первым, получит следующие данные, которые поступают (или уже поступили).

теперь лучше иметь только один поток для обеих операций?

Определенно.

Если да, то как я могу распознать тип полученного пакета?

Как я уже говорил выше, если в этом приложении должны быть «пакеты», вам нужно будет их определить. Это почти наверняка будет включать слово длины, а также может также включать слово типа.