Я создаю сервер веб-сокетов Java, используя Tomcat. На моей сборке, он работает отлично. Однако, когда я развертываю его в рабочей среде, сервер автоматически добавляет «закрыть» к заголовку ответа соединения, немедленно закрывая сокет (который, кажется, никогда не соединяется с сервером в первую очередь).
Вот некоторый контекст для производственной среды:
- Tomcat 7, Java 8 на RHEL
- Связь зашифрована с помощью SSL, websocket использует wss
- Сервер находится за установленным межсетевым экраном (но я ожидаю, что шифрование должно сделать это не проблема)
Моя локальная среда разработки не является точным клоном (так как она используется для нескольких проектов). На нем запущен Tomcat 8, но я считаю, что Tomcat 7 должен иметь сопоставимую поддержку веб-сокетов.
Вот запрос / ответ (записанный инструментами Chrome dev) при отправке веб-сокета на рабочий сервер:
Общие сведения:
Request URL: wss://example.com/WSServer
Request Method: GET
Status Code: 101 Switching Protocols
Ответ:
HTTP/1.1 101 Switching Protocols
Date: Thu, 10 May 2018 17:04:39 GMT
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
Upgrade: websocket
Connection: upgrade, close
Sec-WebSocket-Accept: JFNyciPc/Cza8PFaXWVct6f21qw=
Sec-WebSocket-Extensions: permessage-deflate;client_max_window_bits=15
Content-Length: 0
Content-Type: text/plain; charset=UTF-8
Запрос:
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9
Cache-Control: no-cache
Connection: Upgrade
Cookie: *redacted*
Host: example.com
Origin: https://example.com
Pragma: no-cache
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
Sec-WebSocket-Key: OvMcwMxIYqBLrx9ijlFK/w==
Sec-WebSocket-Version: 13
Upgrade: websocket
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36`
Насколько я могу судить, наиболее показательной частью этого является Connection: upgrade, close
, что объясняет поведение на стороне клиента ниже.
Вот фрагмент кода Javascript на стороне клиента:
var socket = new WebSocket((window.location.protocol==="http:"?"ws:":"wss:") + "//" + window.location.host + "/WSServer");
socket.onopen = function wsOpen() {
socket.send("Hello!"));
}
socket.onclose = function wsClose(reason) {
log(JSON.stringify(reason)); //debug
}
socket.onopen вызывается первым. При нормальном выполнении это не выдает консольного сообщения, но если я задерживаю его выполнение с точкой останова, я получаю сообщение об ошибке: «Websocket уже находится в состоянии ЗАКРЫТО или ЗАКРЫТО».
socket.onclose вызывается сразу после. Код причины - 1006. Без объяснения.
Я также поместил некоторые записи отладки в метод ServerEndpointConfig.Configurator.modifyHandshake, но он никогда не достигает этой точки и не достигает метода @ OnOpen-annotated.
Есть идеи, что вызывает сбой соединения? Опять же, код сервера и клиента работает в dev, поэтому я уверен, что это не проблема кода. Это проблема конфигурации Tomcat (насколько я могу судить, в ее настройке нет ничего необычного). Есть ли что-то очевидное, что я упускаю?
Заранее спасибо за любую помощь!