Проблема параллелизма в Java - PullRequest
2 голосов
/ 11 апреля 2010

Я разрабатываю клиент-серверное приложение для чата на Java. Это безопасное приложение, где сообщения обмениваются с использованием криптографических алгоритмов. У меня есть один сервер, и он может поддерживать много клиентов. Моя проблема в том, что когда один клиент входит на сервер, он работает нормально, но когда другой пользователь входит в систему, сервер начинает выдавать мне исключения из-за неправильного заполнения для зашифрованного текста.

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

Посоветуйте, пожалуйста, как я могу сделать этот процесс более надежным, чтобы количество клиентов не влияло на эффективность работы сервера.

Привет, код такой:

Когда сервер запускается:

Socket in= serverSocket.accept();

                Receive rlt = new Receive(in);
                Thread receiveReq = new Thread(rlt);
                receiveLoginReq.start();

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

  1. В первый раз ошибка HAsh не совпадает для второго клиента
  2. Второй раз javax.crypto.BadPaddingException: ошибка в последнем блоке, неправильно заполненная

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

Любой совет будет высоко оценен. Спасибо

Ответы [ 3 ]

1 голос
/ 11 апреля 2010

Не делиться изменяемыми данными с потоками. Используйте функциональный стиль - нет состояний объекта. Если вам действительно нужно поделиться некоторыми данными с потоками, используйте передачу сообщений.

Убедитесь, что вы правильно закрыли соединения.

Вы можете использовать настоящий сервер, такой как Jetty , который очень прост в установке.

0 голосов
/ 11 апреля 2010

Я могу только догадываться о причинах, не видя полного исходного кода. Я предполагаю, что вы используете CipherInput / OutputStream для своего шифрования. Вы должны использовать отдельные экземпляры Cipher для каждого потока (каждый I / OStream). Каждый раз, когда вы создаете новое соединение или повторно подключаетесь, запускайте метод init Cipher на стороне клиента и сервера и создавайте новые экземпляры CipherInput / OutputStream.

Криптографические объекты являются объектами с состоянием, поэтому они не могут быть разделены между потоками. Каждый поток и каждое соединение должны иметь свои отдельные наборы объектов с состоянием.

0 голосов
/ 11 апреля 2010

Выезд java.lang.ThreadLocal класс.

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