我想在计算机上用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();
}
}
答案 0 :(得分:0)
要编写Websocket服务器,您需要实现涉及升级http连接的Websocket协议。 即使您可以编写程序从头开始执行此操作,也可以使用一些库/框架来解决大部分连接问题。
我想到的两个是使用或任何Java EE容器实现(JSR 356)(java EE 7和8实现),有一些关于使用Spring Boot的替代方法的教程,另一个我记得是使用Netty。
在客户端,如果连接浏览器,则客户端代码将使用javascript编写。仅当要从Java程序而不是浏览器(基于您的问题而不是浏览器)进行连接时,才需要为客户端编写Java代码。
一些可能对您有帮助的链接:
https://docs.oracle.com/javaee/7/tutorial/websocket.htm
https://www.baeldung.com/websockets-spring
https://netty.io/