![](/img/trans.png)
[英]Connect a javascript WebSocket with a Java ServerSocket
[英]Communication between Java ServerSocket and javascript Websocket
我想在計算機上用Java創建服務器,然后通過手機的瀏覽器從手機連接到該服務器。 我還希望能夠在電話(瀏覽器)和計算機(服務器)之間來回發送消息,以便可以更新瀏覽器中顯示的內容。
我的計划是使用ServerSocket創建Java服務器。 當電話連接到瀏覽器中的localhost:port時,服務器將發送一些應啟動websocket的html和javascript代碼。 我能夠在瀏覽器等中顯示標准的html元素,但是當我嘗試啟動websocket時,出現此錯誤:
WebSocket connection to 'ws://localhost:8000/' failed: Error during WebSocket handshake: Unexpected response code: 200
這是正確的方法嗎? 我可以通過其他方式實現嗎?
這是我的代碼。
public class MyClass {
public MyClass() {
final ExecutorService clientProcessingPool = Executors.newFixedThreadPool(10);
Runnable serverTask = new Runnable() {
@Override
public void run() {
try {
ServerSocket serverSocket = new ServerSocket(8000);
System.out.println("Waiting for clients to connect...");
while (true) {
System.out.println("Waiting");
Socket clientSocket = serverSocket.accept();
clientProcessingPool.submit(new ClientTask(clientSocket));
}
} catch (IOException e) {
System.err.println("Unable to process client request");
e.printStackTrace();
}
}
};
Thread serverThread = new Thread(serverTask);
serverThread.start();
}
private class ClientTask implements Runnable {
private final Socket clientSocket;
private ClientTask(Socket clientSocket) {
this.clientSocket = clientSocket;
}
@Override
public void run() {
System.out.println("Got a client !");
PrintWriter out = null;
try {
out = new PrintWriter(clientSocket.getOutputStream());
/*out.println("HTTP/1.1 200 OK");
out.println("Content-Type: text/html");
out.println("\r\n");
out.println("<!DOCTYPE html>");
out.println("<html>");
out.println(" <head>");
out.println(" <title>Test</title>");
out.println(" <script type=\"text/javascript\">");
out.println(" var w = new WebSocket(\"ws://192.168.0.5:8000\")");
out.println("....More code");
out.println(" </script>");
out.println(" </head>");
out.println(" <body>");
out.println(" </body>");
out.println("</html>");*/
out.print("Hej");
out.flush();
} catch (IOException e) {
e.printStackTrace();
}
;
try {
clientSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
System.out.println("Hej");
new MyClass();
}
}
要編寫Websocket服務器,您需要實現Websocket協議,該協議涉及升級http連接。 即使您可以編寫程序從頭開始執行此操作,也可以使用一些庫/框架來解決大部分連接問題。
我想到的兩個是使用或任何Java EE容器實現(JSR 356)(java EE 7和8實現),有一些使用Spring Boot的替代方法教程,我記得的另一個是使用網狀。
在客戶端,如果連接瀏覽器,則客戶端代碼將使用javascript編寫。 如果要從Java程序而不是瀏覽器進行連接,則只需要為客戶端編寫Java代碼(基於您的問題不是您的情況)。
一些鏈接可能會幫助您:
https://docs.oracle.com/javaee/7/tutorial/websocket.htm
https://www.baeldung.com/websockets-spring
https://netty.io/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.