ここで Java で Websocket を使用することについて尋ねられたすべての質問に注いでいますが、私の問題に光を当てるものはありません。コンテキストルートが削除された、または基本的に「」に設定されたサーバーをglassfish 4.0にデプロイしました。これは、私のコードに関係のない他の理由で、プロジェクト リーダーによって行われました。サーバーをローカルのglassfishインストールに公開し、これが単純な「ping」メソッドで機能することを確認しました。これが私のサーバーエンドポイントコードです。
@ServerEndpoint("/test1")
public class UploadWebSocketEndpoint implements Serializable{
/**
*
*/
private static final long serialVersionUID = 9054820114345305531L;
public UploadWebSocketEndpoint() { super(); }
@OnOpen
public void open(Session session)
{
if(session != null)
{
System.out.println(session.getId() + " has opened a connection");
try
{
// session.getBasicRemote().sendText("Connection Established");
}catch(Exception e)
{
e.printStackTrace();
}
}
}
@OnClose
public void close(Session session)
{
if(session != null)
{
System.out.println(session.getId() + " has closed the session");
try
{
// session.close(new CloseReason(CloseReason.CloseCodes.NORMAL_CLOSURE, "ended process"));
}catch(Exception e)
{
e.printStackTrace();
}
}
}
@OnMessage
public String requestAccess(String message, Session session)
{
System.out.println("recieved message: " + message + " from user " + session.getId());
return "";
}
@OnError
public void onError(Throwable t)
{
new Exception(t).getStackTrace();
}
}
できるだけ多くの例と私が見つけたすべてのドキュメントを見た後、これは正しいようです。ここに、tyrus クライアント スタンドアロン jar を使用したクライアント コードを示します。
@ClientEndpoint
public class ClientEndpointSocket
{
Session userSession = null;
private MessageHandler messageHandler;
public ClientEndpointSocket(URI endpointURI)
{
try
{
WebSocketContainer container = ContainerProvider.getWebSocketContainer();
System.out.println("conatiner: " + ContainerProvider.getWebSocketContainer().getClass());
System.out.println("attempting to connect to server at endpoint: " + endpointURI.toString());
container.connectToServer(this, endpointURI);
}catch(Exception e)
{
e.printStackTrace();
}
}
@OnOpen
public void onOpen(Session session)
{
try
{
System.out.println("opening web socket");
this.userSession = session;
}catch(Exception e)
{
e.printStackTrace();
}
}
@OnMessage
public String onMessage(String message, Session session)
{
if(this.messageHandler != null)
{
this.messageHandler.handleMessage(message);
}
return null;
}
@OnClose
public void onClose(Session session, CloseReason closeReason)
{
System.out.println("closing websocket");
this.userSession = null;
}
public void sendMessage(String message)
{
this.userSession.getAsyncRemote().sendText(message);
}
public void addMessageHandler(MessageHandler msgHandler)
{
this.messageHandler = msgHandler;
}
public static interface MessageHandler
{
public void handleMessage(String message);
}
}
そして、これがクライアントのメインクラスです
public class EncryptionMain {
public static void main(String[] args)
{
try
{
WebSocketContainer container = ContainerProvider.getWebSocketContainer();
String uri = "ws://localhost:8080/test1";
System.out.println("connecting to server: " + uri);
container.connectToServer(ClientEndpointSocket.class, URI.create(uri));
}catch(Exception e)
{
e.printStackTrace();
}
}
}
そして最後に、スタックトレース:
javax.websocket.DeploymentException: Handshake error.
at org.glassfish.tyrus.client.ClientManager$3$1.run(ClientManager.java:674)
at org.glassfish.tyrus.client.ClientManager$3.run(ClientManager.java:712)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at org.glassfish.tyrus.client.ClientManager$SameThreadExecutorService.execute(ClientManager.java:866)
at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:112)
at org.glassfish.tyrus.client.ClientManager.connectToServer(ClientManager.java:511)
at org.glassfish.tyrus.client.ClientManager.connectToServer(ClientManager.java:317)
at main.java.application.EncryptionMain.main(EncryptionMain.java:34)
Caused by: org.glassfish.tyrus.core.HandshakeException: Response code was not 101: 404.
at org.glassfish.tyrus.client.TyrusClientEngine.processResponse(TyrusClientEngine.java:320)
at org.glassfish.tyrus.container.grizzly.client.GrizzlyClientFilter.handleHandshake(GrizzlyClientFilter.java:346)
at org.glassfish.tyrus.container.grizzly.client.GrizzlyClientFilter.handleRead(GrizzlyClientFilter.java:315)
at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:283)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:200)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:132)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:111)
at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:536)
at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:117)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:56)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:137)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:591)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:571)
at java.lang.Thread.run(Thread.java:745)
プロジェクトについてさらに情報が必要な場合は、お知らせください。404 エラーで、私は自分の URL が間違っていると思いましたが、サーバーをテストしたところ、http リソースの localhost/app に常駐していました。ここに記載されている情報に誤りや不足がありましたら、もう一度お知らせください。事前に助けてくれてありがとう