Существует ли путь к нескольким процессам для совместного использования сокета слушания?

Нет. java.io.File может использоваться только для отображения реальных каталогов.

Однако вы можете рассматривать его как java.nio.file.Path.

В целом у вас есть три варианта :

  1. Откройте .jar в качестве Zip File System и используйте Files.newDirectoryStream или Files.list .
  2. Итерируйте все записи в файле .jar, ища имена, которые соответствуют.
  3. Поместите текстовый файл в ваш .jar, который содержит имена всех записей в каталоге , поэтому вам не нужно пытаться их перечислить.

86
задан Daniel Earwicker 22 March 2009 в 13:53
поделиться

6 ответов

Можно совместно использовать сокет между два (или больше) процессы в Linux и даже Windows.

В соответствии с Linux (Или POSIX вводят ОС), с помощью fork() заставит разветвленного ребенка иметь копии дескрипторов файлов всего родителя. Любой, что это не закрывается, продолжит совместно использоваться, и (например, с TCP, слушая сокет) может привыкнуть к accept() новые сокеты для клиентов. Это то, сколько серверов, включая Apache в большинстве случаев, работу.

В Windows то же самое в основном верно, кроме нет никакого fork() системный вызов, таким образом, родительский процесс должен будет использовать CreateProcess или что-то для создания дочернего процесса (который может, конечно, использовать тот же исполняемый файл), и должен передать его наследуемый дескриптор.

Создание слушания снабдить наследуемый дескриптор сокетом не является абсолютно тривиальным действием, но не слишком хитрое также. DuplicateHandle() потребности, которые будут использоваться для создания дублирующегося дескриптора (все еще в родительском процессе однако), который будет иметь наследуемый набор флага на нем. Тогда можно дать тот дескриптор в STARTUPINFO структура к дочернему процессу в CreateProcess как STDIN, OUT или ERR дескриптор (предполагающий, что Вы не хотели использовать его для чего-либо еще).

РЕДАКТИРОВАНИЕ:

Чтение библиотеки MDSN, кажется, что WSADuplicateSocket более устойчивый или корректный механизм выполнения этого; это все еще нетривиально, потому что родитель/дочерние процессы должен удаться, какой дескриптор должен быть дублирован некоторым механизмом IPC (хотя это могло быть столь же просто как файл в файловой системе)

РАЗЪЯСНЕНИЕ:

В ответе на исходный вопрос OP, нет, несколько процессов не могут bind(); просто исходный родительский процесс звонил бы bind(), listen() и т.д., дочерние процессы просто обработают запросы [1 113], send(), recv() и т.д.

90
ответ дан user 5 November 2019 в 15:43
поделиться

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

s = socket();
bind(s);
listen(s);
while (1) {
  s2 = accept(s);
  send_to_worker(s2);
}
3
ответ дан HUAGHAGUAH 5 November 2019 в 15:43
поделиться

Это походит на то, что Вы хотите, один процесс, слушающий на для новых клиентов, и затем вручите от соединения, как только Вы получаете соединение. Чтобы сделать это через потоки легко, и в .NET у Вас даже есть BeginAccept и т.д. методы для заботы о большой инфраструктуре для Вас. Вручить от соединений через границы процесса было бы сложным и не будет иметь никаких преимуществ производительности.

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

TcpListener tcpServer = new TcpListener(IPAddress.Loopback, 10090);
tcpServer.Server.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
tcpServer.Start();

while (true)
{
    TcpClient client = tcpServer.AcceptTcpClient();
    Console.WriteLine("TCP client accepted from " + client.Client.RemoteEndPoint + ".");
}

, Если Вы разжигаете два процесса каждое выполнение вышеупомянутый код, это будет работать, и первый процесс, кажется, получает все соединения. Если первый процесс уничтожается, второй тогда получает соединения. С сокетом, совместно использующим как этот, я не уверен точно, как Windows решает, какой процесс получает новые соединения, хотя быстрый тест действительно указывает на самый старый процесс, получая их сначала. Относительно того, совместно использует ли это, если первый процесс занят или что-либо как этот, что я не знаю.

2
ответ дан sipwiz 5 November 2019 в 15:43
поделиться

Другой подход (который избегает многих сложных деталей) в Windows при использовании HTTP должен использовать HTTP.SYS. Это позволяет нескольким процессам слушать различные URL на том же порте. На Сервере 2003/2008/Vista/7 это - то, как IIS работает, таким образом, можно совместно использовать порты с ним. (На XP поддерживается SP2 HTTP.SYS, но IIS5.1 не использует его.)

Другие API высокого уровня (включая WCF) используют HTTP.SYS.

2
ответ дан Richard 5 November 2019 в 15:43
поделиться

В соответствии с Windows (и Linux) для одного процесса возможно открыть сокет и затем передать тот сокет другому процессу, таким образом, что тот второй процесс может также затем использовать тот сокет (и передать его в свою очередь, должен он хотеть сделать так).

Решающим вызовом функции является WSADuplicateSocket ().

Это заполняет структуру с информацией о существующем сокете. Эта структура затем, с помощью механизма IPC по Вашему выбору, передается другому существующему процессу (обратите внимание, что я говорю существующий - когда Вы называете WSADuplicateSocket (), необходимо указать на целевой процесс, который получит испускаемую информацию).

Процесс получения может затем назвать WSASocket (), передающий в этой структуре информации, и получить дескриптор к базовому сокету.

Оба процесса теперь содержат дескриптор к тому же базовому сокету.

3
ответ дан 24 November 2019 в 08:01
поделиться

Я хотел бы добавить, что сокеты могут использоваться совместно в Unix / Linux через сокеты AF__UNIX (межпроцессные сокеты). Похоже, что происходит создание нового дескриптора сокета, который является своего рода псевдонимом исходного. Этот новый дескриптор сокета отправляется через сокет AFUNIX другому процессу. Это особенно полезно в случаях, когда процесс не может fork () поделиться своими файловыми дескрипторами. Например, при использовании библиотек, предотвращающих это из-за проблем с потоками. Вы должны создать сокет домена Unix и использовать libancillary для передачи дескриптора.

См .:

Для создания сокетов AF_UNIX:

Например код:

12
ответ дан 24 November 2019 в 08:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: