0

Я запускаю сервер Java (конкретный Jetty) на экземпляре AWS EC2, используя WebSocket для подключения к браузеру клиента. Когда я делаю это локально (хостинг сервера на моем компьютере, а не AWS), он работает нормально. Однако, когда я двигаю код экземпляра EC2, я получаю следующее сообщение об ошибке на стороне клиента:Ошибка установления соединения с WebSocket с AWS

WebSocket connection to 'ws://Elastic_IP:8080/?username=name_of_user' failed: Error during WebSocket handshake: Unexpected response code: 500

Я удостоверился, что экземпляр EC2 будет принимать трафик на порт 8080.

На стороне сервера , я получаю много java.lang.NoClassDefFoundError при попытке подключения. Я не получаю эту ошибку, когда я запускаю ее локально. Возможно, есть проблема, когда я компилирую экземпляр EC2, но он компилируется без ошибок. Я компилирую и запускаю код, используя Eclipse локально, но я компилирую и запускаю код на EC2 вручную (javac с большим количеством путей к классам). Вероятно, я сделал ошибку при компиляции вручную, но я не уверен, что может быть ошибкой.

Любая помощь была бы принята с благодарностью.

EDIT
После небольшого поиска неисправностей на моей, я понял, что JSON.ParseException был источником проблемы. После того как я удалил все вызовы этого класса из кода сервера, рукопожатие было завершено, и я смог установить соединение между сервером и клиентом. Однако, сейчас я бегу в следующее сообщение об ошибке, когда я получаю сообщение от клиента:

WARN:MyWebSocketHandler:qtp990368553-16: Unhandled Error (closing connection) 
java.lang.RuntimeException: Cannot call method public void 
MyWebSocketHandler#onMessage(org.eclipse.jetty.websocket.api.Session, java.lang.String) with args: 
[org.eclipse.jetty.websocket.common.WebSocketSession, java.lang.String] 

кажется, что я определил аргумент быть org.eclipse.jetty.websocket.api.Session, но во время выполнения аргумент на самом деле org.eclipse.jetty.websocket.common.WebSocketSession. Любые идеи о том, как это происходит, или какой (Session vs WebSocketSession) Я должен использовать? Единственная возможность, которая мне нужна, - отправить строки между сервером и клиентом.

+0

Не могли бы вы предоставить полный стек, чтобы мы могли видеть, в каком классе, в частности, JVM жалуется? Кроме того, вместо того, чтобы использовать Eclipse для локального запуска кода сервера, можете ли вы попробовать запустить его локально так же, как и в экземпляре EC2, чтобы ваша локальная среда была ближе или больше похожа на ту, которая находится на экземпляре EC2? – Castaglia

+0

@Castaglia Я исправил основную проблему для рукопожатия (мне пришлось удалить импорт на код сервера, но он работает на локальной стороне с импортом), но я ударяю еще один дорожный блок. Я обновил вопросы, чтобы отразить мое несчастье. – skamazin

ответ

0

Я выяснил возможное решение моей проблемы. Через Eclipse я могу выполнить проект Java в исполняемый банку («упаковывая» библиотеки в банку). Затем запуск с java -jar <jar_filename> будет работать на сервере и работать так же, как на локальном компьютере. Тем не менее, я заметил некоторые проблемы с производительностью (медленный старт), поэтому я не думаю, что это решение best, но это решение.

Смежные вопросы