Jetty:套接字连接作为websocket连接
Jetty: socket connection as websocket connection
我是 websocket 编程的新手(或者更好:完全是 web 编程)。
不久前,我使用 Sockets 和 ServerSockets 制作了一些东西来在客户端和服务器之间交换数据,现在我开始使用 WebSockets 和 jetty 来构建具有类似功能的东西,但直到现在我才弄明白。
所以我现在的目标是:客户端收到一条字符串消息,使用 websocket 将其发送到服务器,服务器只是粘贴该消息(到控制台或文件) .
一般情况:我在不同的机器上有 2 个应用程序 运行,我想使用 websockets 在它们之间交换一些数据。
这就是我客户的代码:
public class SocketClient {
public static void main(String[] args) throws URISyntaxException {
try {
new SocketClient().run(new URI("ws://localhost:8080/"));
//new SocketClient().run(new URI("wss://localhost:8443/"));
} catch (Exception e) {
e.printStackTrace();
}
}
public void run(URI destURI) throws Exception {
WebSocketClient client = new WebSocketClient();
try {
client.start();
ClientUpgradeRequest request = new ClientUpgradeRequest();
ExampleSocket socket = new ExampleSocket();
Future<Session> future = client.connect(socket,destURI,request);
future.get();
socket.getRemote().sendString("hello server");
}
finally
{
client.stop();
}
}
}
class ExampleSocket extends WebSocketAdapter
{
@Override
public void onWebSocketText(String message)
{
try
{
getRemote().sendString(message);
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
这是我的服务器代码:
public class SocketServer extends AbstractHandler {
public void handle(String target, Request baseRequest,HttpServletRequest request, HttpServletResponse response) {
try {
response.setContentType("text/html");
response.setStatus(HttpServletResponse.SC_OK);
baseRequest.setHandled(true);
response.getWriter().println(request);
}
catch (IOException ioe) {
System.out.println(ioe);
}
}
public static void main(String[] args) throws Exception {
Server server = new Server(8080);
server.setHandler(new SocketServer());
server.start();
server.join();
}
}
我主要是从码头文档中获得的,但直到现在才弄明白。当我一起尝试 运行 它们时,我的客户端出现了错误:
java.util.concurrent.ExecutionException: org.eclipse.jetty.websocket.api.UpgradeException: Didn't switch protocols
at org.eclipse.jetty.util.FuturePromise.get(FuturePromise.java:123)
at SocketClient.run(SocketClient.java:37)
at SocketClient.main(SocketClient.java:19)
Caused by: org.eclipse.jetty.websocket.api.UpgradeException: Didn't switch protocols
at org.eclipse.jetty.websocket.client.io.UpgradeConnection.validateResponse(UpgradeConnection.java:278)
at org.eclipse.jetty.websocket.client.io.UpgradeConnection.read(UpgradeConnection.java:205)
at org.eclipse.jetty.websocket.client.io.UpgradeConnection.onFillable(UpgradeConnection.java:150)
at org.eclipse.jetty.io.AbstractConnection.run(AbstractConnection.java:540)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:635)
at org.eclipse.jetty.util.thread.QueuedThreadPool.run(QueuedThreadPool.java:555)
at java.lang.Thread.run(Unknown Source)
非常感谢您的帮助。
WebSocket 客户端需要 WebSocket 服务器。您在服务器中所做的是添加一个处理程序来仅处理 HTTP 请求-响应交换。您需要通过注册 org.eclipse.jetty.websocket.servlet.WebSocketServlet
的 servlet 或 javax.websocket.Endpoint
.
的端点来允许 Jetty 处理 WebSocket 资源
这是 Jetty 团队编写的working examples。如果您不喜欢 JSR,请查看 native-jetty-websocket-example。
无论如何,如果这个答案不完整,Jetty 团队会给你明确的答案,因为他们正在看码头标签。
服务器可能以安全连接模式启动并尝试与非安全连接 URL,反之亦然。这可能是此异常的根本原因。
我是 websocket 编程的新手(或者更好:完全是 web 编程)。 不久前,我使用 Sockets 和 ServerSockets 制作了一些东西来在客户端和服务器之间交换数据,现在我开始使用 WebSockets 和 jetty 来构建具有类似功能的东西,但直到现在我才弄明白。
所以我现在的目标是:客户端收到一条字符串消息,使用 websocket 将其发送到服务器,服务器只是粘贴该消息(到控制台或文件) . 一般情况:我在不同的机器上有 2 个应用程序 运行,我想使用 websockets 在它们之间交换一些数据。
这就是我客户的代码:
public class SocketClient {
public static void main(String[] args) throws URISyntaxException {
try {
new SocketClient().run(new URI("ws://localhost:8080/"));
//new SocketClient().run(new URI("wss://localhost:8443/"));
} catch (Exception e) {
e.printStackTrace();
}
}
public void run(URI destURI) throws Exception {
WebSocketClient client = new WebSocketClient();
try {
client.start();
ClientUpgradeRequest request = new ClientUpgradeRequest();
ExampleSocket socket = new ExampleSocket();
Future<Session> future = client.connect(socket,destURI,request);
future.get();
socket.getRemote().sendString("hello server");
}
finally
{
client.stop();
}
}
}
class ExampleSocket extends WebSocketAdapter
{
@Override
public void onWebSocketText(String message)
{
try
{
getRemote().sendString(message);
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
这是我的服务器代码:
public class SocketServer extends AbstractHandler {
public void handle(String target, Request baseRequest,HttpServletRequest request, HttpServletResponse response) {
try {
response.setContentType("text/html");
response.setStatus(HttpServletResponse.SC_OK);
baseRequest.setHandled(true);
response.getWriter().println(request);
}
catch (IOException ioe) {
System.out.println(ioe);
}
}
public static void main(String[] args) throws Exception {
Server server = new Server(8080);
server.setHandler(new SocketServer());
server.start();
server.join();
}
}
我主要是从码头文档中获得的,但直到现在才弄明白。当我一起尝试 运行 它们时,我的客户端出现了错误:
java.util.concurrent.ExecutionException: org.eclipse.jetty.websocket.api.UpgradeException: Didn't switch protocols
at org.eclipse.jetty.util.FuturePromise.get(FuturePromise.java:123)
at SocketClient.run(SocketClient.java:37)
at SocketClient.main(SocketClient.java:19)
Caused by: org.eclipse.jetty.websocket.api.UpgradeException: Didn't switch protocols
at org.eclipse.jetty.websocket.client.io.UpgradeConnection.validateResponse(UpgradeConnection.java:278)
at org.eclipse.jetty.websocket.client.io.UpgradeConnection.read(UpgradeConnection.java:205)
at org.eclipse.jetty.websocket.client.io.UpgradeConnection.onFillable(UpgradeConnection.java:150)
at org.eclipse.jetty.io.AbstractConnection.run(AbstractConnection.java:540)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:635)
at org.eclipse.jetty.util.thread.QueuedThreadPool.run(QueuedThreadPool.java:555)
at java.lang.Thread.run(Unknown Source)
非常感谢您的帮助。
WebSocket 客户端需要 WebSocket 服务器。您在服务器中所做的是添加一个处理程序来仅处理 HTTP 请求-响应交换。您需要通过注册 org.eclipse.jetty.websocket.servlet.WebSocketServlet
的 servlet 或 javax.websocket.Endpoint
.
这是 Jetty 团队编写的working examples。如果您不喜欢 JSR,请查看 native-jetty-websocket-example。
无论如何,如果这个答案不完整,Jetty 团队会给你明确的答案,因为他们正在看码头标签。
服务器可能以安全连接模式启动并尝试与非安全连接 URL,反之亦然。这可能是此异常的根本原因。