我很新的websocket編程(或更好的:網絡編程)。 前一段時間,我做了一些使用套接字和服務器套接字在客戶端和服務器之間交換數據的東西,現在我開始使用WebSockets和jetty構建類似功能的東西,但直到現在才知道。碼頭:套接字連接作爲websocket連接
所以我打算做的是:客戶端得到一個字符串消息,使用websocket將其發送到服務器,服務器只是將該消息粘貼到控制檯或文件中。 一般上下文:我有兩個應用程序在不同的機器上運行,並希望使用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$2.run(AbstractConnection.java:540)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:635)
at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:555)
at java.lang.Thread.run(Unknown Source)
所以感謝很多提前,任何幫助表示讚賞。
感謝您的建議,我錯過了一些東西。試圖用Endpoint解決它,這讓我更接近解決方案。目前我們試圖解決整個問題有點不同,所以它被認爲是解決了。非常感謝! – Nidhoeggr 2015-04-14 15:56:34
的確,您需要客戶端的websocket和服務器端點的websocket。我遇到了同樣的問題,但是當我按照下面的示例4.6時,所有事情都很清楚: https://examples.javacodegeeks.com/enterprise-java/jetty/jetty-websocket-example/ 無論誰有這個問題,試着仔細看看那個鏈接,這是有道理的。 – ancab 2017-05-25 08:49:36