import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; import org.eclipse.lsp4j.jsonrpc.Launcher; public class App { final static int DEFAULT_PORT = 50000; public static void main(String[] args) { final int port = args.length > 0 ? Integer.parseInt(args[0]) : DEFAULT_PORT; System.out.println("Starting server on port: " + port); new App().startNetworkedLanguageServer(port); } /** * Starts the language server on the given port in a new thread * @param port the port to start the server on */ private void startNetworkedLanguageServer(int port) { new Thread(() -> { try (ServerSocket serverSocket = new ServerSocket(port)) { while (true) { Socket socket = null; try { socket = serverSocket.accept(); InputStream in = socket.getInputStream(); OutputStream out = socket.getOutputStream(); LJLanguageServer server = new LJLanguageServer(); Launcher launcher = new Launcher.Builder() .setLocalService(server) .setRemoteInterface(LJLanguageClient.class) .setInput(in) .setOutput(out) .create(); server.connect(launcher.getRemoteProxy()); launcher.startListening(); } catch (IOException e) { System.out.println("Error: " + e.getMessage()); e.printStackTrace(); if (socket != null && !socket.isClosed()) { try { socket.close(); } catch (IOException closeException) { System.out.println("Error closing socket: " + closeException.getMessage()); } } } } } catch (IOException e) { System.out.println("Error: " + e.getMessage()); e.printStackTrace(); } }).start(); } }