Простой сервер для шаринга экрана

  1. import java.awt.{Rectangle, Robot, Toolkit}
  2. import java.io.{ByteArrayOutputStream, PrintWriter}
  3. import java.net.{InetAddress, ServerSocket, Socket}
  4. import java.util.Base64
  5. import javax.imageio.ImageIO
  6.  
  7. object DesktopSharer {
  8.  
  9.   val PORT = 7119
  10.   val robot = new Robot()
  11.  
  12.   def main(args: Array[String]) {
  13.     val serverSocket = new ServerSocket(PORT)
  14.     println("Server started at " + InetAddress.getLocalHost.getHostAddress + ":" + PORT)
  15.     while (true) {
  16.       val socket = serverSocket.accept
  17.       new Sharer(socket).start()
  18.     }
  19.     serverSocket.close
  20.   }
  21.  
  22.   class Sharer(val socket: Socket) extends Thread {
  23.     override def run() {
  24.       val rectangle = new Rectangle(Toolkit.getDefaultToolkit.getScreenSize)
  25.       val img = robot.createScreenCapture(rectangle)
  26.       val imgStream = new ByteArrayOutputStream()
  27.       ImageIO.write(img, "jpg", imgStream)
  28.       imgStream.flush
  29.       val html = toHtml(imgStream.toByteArray)
  30.       imgStream.close
  31.       println("Send " + html.length + " bytes to " + socket.getRemoteSocketAddress)
  32.  
  33.       val pw = new PrintWriter(socket.getOutputStream, true)
  34.       pw.println("HTTP/1.1 200 OK")
  35.       pw.println("Content-Type: text/html")
  36.       pw.println("Cache-Control,no-store,no-cache,must-revalidate")
  37.       pw.println("Content-Length: " + html.length)
  38.       pw.println
  39.       pw.println(html)
  40.       pw.flush
  41.       pw.close
  42.       socket.close
  43.     }
  44.  
  45.     private def toHtml(bytes: Array[Byte]) : String = {
  46.       val src = Base64.getEncoder.encodeToString(bytes)
  47.       return s"""
  48.          |<html>
  49.          |<body>
  50.          |  <img src="data:image/jpeg;base64,$src" />
  51.          |</body>
  52.          |</html>
  53.        """.stripMargin
  54.     }
  55.   }
  56. }
Запускает сервер, который отправляет изображение экрана клиентам-браузерам.
  1. scala DesktopSharer.scala
Аналог на Java 14+
  1. import java.awt.Rectangle;
  2. import java.awt.Robot;
  3. import java.awt.Toolkit;
  4. import java.io.IOException;
  5. import java.io.ByteArrayOutputStream;
  6. import java.io.PrintWriter;
  7. import java.net.InetAddress;
  8. import java.net.ServerSocket;
  9. import java.net.Socket;
  10. import java.util.Base64;
  11. import javax.imageio.ImageIO;
  12.  
  13. public class DesktopSharer {
  14.  
  15.     private static final int PORT = 7119;
  16.  
  17.     public static void main(String[] args) throws IOException {
  18.         final var serverSocket = new ServerSocket(PORT);
  19.         var host = InetAddress.getLocalHost().getHostAddress();
  20.         host = "http://192.168.1.139";
  21.         System.out.println("Server started at " + host + ":" + PORT);
  22.         while (true) {
  23.             var socket = serverSocket.accept();
  24.             new Thread(() -> {
  25.                 try {
  26.                     share(socket);
  27.                 } catch(Exception ioe) {}
  28.             }).start();
  29.         }
  30.         // serverSocket.close();
  31.     }
  32.  
  33.     private static void share(Socket socket) throws Exception {
  34.         final var robot = new Robot();
  35.         final var rectangle = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());
  36.         final var img = robot.createScreenCapture(rectangle);
  37.         final var imgStream = new ByteArrayOutputStream();
  38.         ImageIO.write(img, "jpg", imgStream);
  39.         imgStream.flush();
  40.         final var html = toHtml(imgStream.toByteArray());
  41.         imgStream.close();
  42.         System.out.println("Send " + html.length() + " bytes to " + socket.getRemoteSocketAddress());
  43.  
  44.         final var pw = new PrintWriter(socket.getOutputStream(), true);
  45.         pw.println("HTTP/1.1 200 OK");
  46.         pw.println("Content-Type: text/html");
  47.         pw.println("Cache-Control,no-store,no-cache,must-revalidate");
  48.         pw.println("Content-Length: " + html.length());
  49.         pw.println();
  50.         pw.println(html);
  51.         pw.flush();
  52.         pw.close();
  53.         socket.close();
  54.     }
  55.  
  56.     private static String toHtml(byte[] bytes) {
  57.         final var src = Base64.getEncoder().encodeToString(bytes);
  58.         return """
  59.          <html>
  60.          <body>
  61.            <img src="data:image/jpeg;base64,$src" />
  62.          </body>
  63.          </html>
  64.          """.stripIndent().replace("$src", src);
  65.     }
  66. }

Реклама

Мы в соцсетях

tw tg yt gt