Многопоточный сервер в Java. Темы, обслуживающие файлы - PullRequest
0 голосов
/ 18 февраля 2012

Итак, я пишу многопоточный сервер, который принимает в качестве входных данных имя сервера, порт, количество потоков и имя файла для запроса. Моя задача - создать сокет через main, а затем расширить объект Runnable ( который принимает сокет и имя файла) .. У меня также есть таймерная задача, которая срабатывает по истечении 5 секунд, а затем закрывает и останавливает все потоки .. Мой текущий дизайн - создать сокет в main, передать его в runnable (где существует условие while для условия x, запрашивающее файл снова и снова), а затем, когда задача запускается, она устанавливает для частной общей переменной x в runnable значение false.

Я сталкиваюсь с множеством проблем со сломанной трубой, из-за чего я полагаю, что мой дизайн имеет недостатки. Я что-то упустил? Я не использую синхронизированные / заблокированные переменные. Должен ли я создавать новый сокет для каждого запроса файла?

StackTrace:

java.net.SocketException: Broken pipe
    at java.net.SocketOutputStream.socketWrite0(Native Method)
    at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
    at java.net.SocketOutputStream.write(SocketOutputStream.java:115)
    at java.io.DataOutputStream.writeBytes(DataOutputStream.java:259)
    at FR.filesRecv(Client.java:62)
    at FR.run(Client.java:79)
    at java.lang.Thread.run(Thread.java:637)

1 Ответ

1 голос
/ 18 февраля 2012

Некоторые общие комментарии:

  • Да, у каждого клиента должно быть свое собственное сокетное соединение с сервером.
  • На стороне сервера есть сокет сервера, но когда соединениепринимается от клиента, для каждого обработчика создается новый сокет для связи с соответствующим клиентом.
  • Я бы разветвлял потоки в main, а затем просто спал в течение 5 секунд, а затем установил runnableпеременные должны быть ложными.Нет необходимости в задании таймера.
  • Затем вы можете либо немедленно выйти из main, если вы хотите, чтобы JVM быстро остановилась, либо вы можете вызвать join() в каждом из ваших потоков, чтобы убедиться, что они завершаются соответствующим образом.,Вы также можете установить thread.setDaemon(false); до начала потока и затем выйти из main, и JVM не остановится, пока потоки не закончатся самостоятельно.
  • Необходимо убедиться, что переменная runnablevolatile если он будет установлен из другого потока.
...