#java #websocket
#java #websocket
Вопрос:
У меня есть класс сервера websocket, где я хочу печатать при подключении пользователя. Это работает без проблем, однако, если я хочу выполнить метод за пределами этого сервера websocket, он не печатает, а закрывает клиентское соединение и выводит ошибку java RuntimeException.
package com.rupla.myapp.endpoint;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.sql.SQLException;
import javax.websocket.EncodeException;
import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
import com.rupla.myapp.encoders.MessageEncoder;
import com.rupla.myapp.http.MyOtherClas;
import com.rupla.myapp.encoders.MessageDecoder;
@ServerEndpoint(value = "/chatnow", encoders = MessageEncoder.class, decoders = MessageDecoder.class)
public class WebSocketServer {
@OnOpen
public void onOpen(Session session) {
extracted(session);
}
private void extracted(Session session) {
System.out.println("Session Opened (Client to Server) - ID: " session.getId());
}
@OnMessage
public void handleTextMessage(String message, Session s) throws IOException {
System.out.println("New Text Message Received: " message " - From session: " s.getId());
//So here we send client's message to the client - This works
s.getBasicRemote().sendText("Server: " message);
try {
// Here I try to print "hello" but from 'MyOtherClas'.class using printTest() method
MyOtherClas.printTest();
//Right after this code, server closes the connection to the client and doesn't print anything
}
catch(Exception e) {
System.out.println("fail: " e);
}
}
/**
* If I would call this method below, it would work since it's in the same class (but why?)
*/
private void printInsideClas() {
System.out.println("hello");
}
@OnClose
public void onClose(Session session) throws IOException, EncodeException {
System.out.println("Session Closed");
}
@OnError
public void onError(Throwable t) {
System.out.println("onError: " t);
}
}
Довольно простой сервер websocket для Java. Однако, когда я запускаю это на своем tomcat 9.0 и подключаюсь к клиенту javascript и пытаюсь отправить сообщение от моего клиента на сервер. Это закрывает соединение между сервером и клиентом, а затем выводит эту ошибку.
Session Opened (Client to Server) - ID: 4
New Text Message Received: asd - From session: 4
onError: java.lang.RuntimeException: org/apache/http/Header
Session Closed
Я пытался погуглить это в течение нескольких дней, но пока у меня нет ответов, мне действительно нужна помощь с этим.
Комментарии:
1. Измените свой код, чтобы напечатать stacktrace исключения …. и покажите его нам.
2. Спасибо за ответ, он действительно дает больше информации об ошибке. У меня есть HttpClient в моем пути к библиотеке. Это выдает эту ошибку при печати stacktrace:
java.lang.RuntimeException: org/apache/http/Header at org.apache.tomcat.websocket.pojo.PojoMessageHandlerBase.handlePojoMethodException(PojoMessageHandlerBase.java:119) at ... 18 more Caused by: java.lang.ClassNotFoundException: org.apache.http.Header at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1363) ... 24 more Session Closed
3. Ссылка для полной ошибки: pastebin
Ответ №1:
Исключение находится в стеке веб-сервисов на стороне сервера. Исключение гласит, что он не может загрузить базовый класс, который является частью Apache HttpComponents.
Вот несколько возможных объяснений:
- В вашей серверной среде выполнения отсутствует файл JAR.
- JAR присутствует, но он не находится в правильном пути к классу среды выполнения.
Header
Класс зависит от какого-то другого класса, у которого не удалось инициализировать класс. Если это произошло, в файле журнала должны быть доказательства ранее.
Файл JAR, который вы должны искать, это «httpcore-.jar «или эквивалент из старого проекта Jakarta.
Выясните, что из вышеперечисленного произошло, и вы близки к решению проблемы.