Click here to Skip to main content
13,146,739 members (85,999 online)
Click here to Skip to main content
Add your own
alternative version

Stats

12K views
2 bookmarked
Posted 21 Aug 2015

Remote Desktop Application

, 21 Aug 2015
Rate this:
Please Sign up or sign in to vote.
Remote desktop application

Login

Active Client IP Address & Show the Multiple Client Screen

Client Screen

Server Send to the File

Server Send MSG to Client

Client Receive MSG

Introduction

This project is based on Server and Client System. The primary objective behind development of “Remote Desktop Application” is to provide a mechanism by which System Administrator remotely connects to a desktop machine. It monitors the Client machine and resolves the basic problem for the user.

This project performs the following tasks:

  1. Views a Desktop remotely
  2. Handles basic problem form Client
  3. Handles all controls for Client System
  4. Server Sent to the file and MSG to Client

Background

One of the biggest challenges in this project is finding a way to move the mouse pointer, simulate key stroke and capture the screen. After spending some time, I found a great Robot class that does all that I need.

In addition, using serialization to send screenshots from client to server and to send server events like mouse move, key press, key release helped me a lot to write clean and simple code instead of sending images and events in raw data format over the network.

Program Parts

1. RemoteServer

This is the server part which waits for clients connections and per each connected client, a new frame appears showing the current client screen. When you move the mouse over the frame, this results in moving the mouse at the client side. The same happens when you right/left click mouse button or type a key while the frame is in focus.

2. RemoteClient

This is the client side, its core function is sending a screen shot of the client's desktop every predefined amount of time. Also it receives server commands such as "move the mouse command", then executes the command at the client's PC.

Using the Code

In order to run the program, you need to download RemoteServer_source.zip and RemoteClient_source.zip on two different PCs, then extract them. In one of the PCs say PC1, run RemoteServer.jar which is located under dist folder using the following command:

>> java -jar  RemoteServer.jar 

You will be asked to enter port number for the server to listen at, enter any port number above 1024, for example 5000.

On the other PC say PC2, execute RemoteClient.jar using the following command:

>> java -jar RemoteClient.jar  

You will be asked to enter server IP, enter IP address of PC1, then you will be asked to enter port number, enter the same port you entered above, e.g. 5000.

Now, in PC1, you have full control over PC2 including moving the mouse, clicking the mouse, keys stroking, viewing PC2 desktop, etc.

Coding Structure

RemoteServer

ServerInitiator Class

This is the entry class which listens to server port and wait for clients connections. Also, it creates an essential part of the program GUI.

ClientHandler Class

Per each connected client, there is an object of this class. It shows an InternalFrame per client and it receives clients' screen dimension.

ClientScreenReciever Class

Receives captured screen from the client, then displays it.

ClientCommandsSender Class

It listens to the server commands, then sends them to the client. Server commands include mouse move, key stroke, mouse click, etc.

EnumCommands Class

Defines constants which are used to represent server commands.

RemoteClient

ClientInitiator Class

This is the entry class that starts the client instance. It establishes connection to the server and creates the client GUI.

ScreenSpyer Class

Captures screen periodically and sends them to the server.

ServerDelegate Class

Receives server commands and executes them in the client PC.

EnumCommands Class

Defines constants which are used to represent server commands.

Code Snippets

1) RemoteClient

Connect to Server
System.out.println("Connecting to server ..........");
socket = new Socket(ip, port);
System.out.println("Connection Established.");
Capture Desktop Screen then Send it to the Server Periodically

In ScreenSpyer class, Screen is captured using createScreenCapture method in Robot class and it accepts a Rectangle object which carries screen dimension. If we try to send image objects directly using serialization, it will fail because it does not implement Serializable interface. That is why we have to wrap it using the ImageIcon class as shown below:

while(continueLoop){
            //Capture screen
            BufferedImage image = robot.createScreenCapture(rectangle);
            /* I have to wrap BufferedImage with ImageIcon because 
	     * BufferedImage class does not implement Serializable interface
             */
            ImageIcon imageIcon = new ImageIcon(image);

            //Send captured screen to the server
            try {
                System.out.println("before sending image");
                oos.writeObject(imageIcon);
                oos.reset(); //Clear ObjectOutputStream cache
                System.out.println("New screenshot sent");
            } catch (IOException ex) {
               ex.printStackTrace();
            }

            //wait for 100ms to reduce network traffic
            try{
                Thread.sleep(100);
            }catch(InterruptedException e){
                e.printStackTrace();
            }
        }
Receive Server Events, then call Robot Class Methods to Execute these Events
while(continueLoop){
                //receive commands and respond accordingly
                System.out.println("Waiting for command");
                int command = scanner.nextInt();
                System.out.println("New command: " + command);
                switch(command){
                    case -1:
                        robot.mousePress(scanner.nextInt());
                    break;
                    case -2:
                        robot.mouseRelease(scanner.nextInt());
                    break;
                    case -3:
                        robot.keyPress(scanner.nextInt());
                    break;
                    case -4:
                        robot.keyRelease(scanner.nextInt());
                    break;
                    case -5:
                        robot.mouseMove(scanner.nextInt(), scanner.nextInt());
                    break;
                }
            }

2) RemoteServer

Wait for Clients Connections
//Listen to server port and accept clients connections
            while(true){
                Socket client = sc.accept();
                System.out.println("New client Connected to the server");
                //Per each client create a ClientHandler
                new ClientHandler(client,desktop);
            }
Receive Client Desktop Screenshots and Display them
 while(continueLoop){
 //Receive client screenshot and resize it to the current panel size
  ImageIcon imageIcon = (ImageIcon) cObjectInputStream.readObject();
  System.out.println("New image received");
  Image image = imageIcon.getImage();
  image = image.getScaledInstance
	(cPanel.getWidth(),cPanel.getHeight(),Image.SCALE_FAST);
  //Draw the received screenshot
  Graphics graphics = cPanel.getGraphics();
  graphics.drawImage(image, 0, 0, cPanel.getWidth(),cPanel.getHeight(),cPanel);
}
Handle Mouse and Key Events then Send them to the Client Program to Simulate them

In ClientCommandsSender class, when mouse is moved, x and y values are sent to the client but we have to take into consideration the size difference between clients' screen size and server's panel size, that is why we have to multiply by a certain factor as shown in the following code:

public void mouseMoved(MouseEvent e) {
     double xScale = clientScreenDim.getWidth()/cPanel.getWidth();
     System.out.println("xScale: " + xScale);
     double yScale = clientScreenDim.getHeight()/cPanel.getHeight();
     System.out.println("yScale: " + yScale);
     System.out.println("Mouse Moved");
     writer.println(EnumCommands.MOVE_MOUSE.getAbbrev());
     writer.println((int)(e.getX() * xScale));
     writer.println((int)(e.getY() * yScale));
     writer.flush();
 }

 public void mousePressed(MouseEvent e) {
     System.out.println("Mouse Pressed");
     writer.println(EnumCommands.PRESS_MOUSE.getAbbrev());
     int button = e.getButton();
     int xButton = 16;
     if (button == 3) {
         xButton = 4;
     }
     writer.println(xButton);
     writer.flush();
 }

 public void mouseReleased(MouseEvent e) {
     System.out.println("Mouse Released");
     writer.println(EnumCommands.RELEASE_MOUSE.getAbbrev());
     int button = e.getButton();
     int xButton = 16;
     if (button == 3) {
         xButton = 4;
     }
     writer.println(xButton);
     writer.flush();
 }

 public void keyPressed(KeyEvent e) {
     System.out.println("Key Pressed");
     writer.println(EnumCommands.PRESS_KEY.getAbbrev());
     writer.println(e.getKeyCode());
     writer.flush();
 }

 public void keyReleased(KeyEvent e) {
     System.out.println("Mouse Released");
     writer.println(EnumCommands.RELEASE_KEY.getAbbrev());
     writer.println(e.getKeyCode());
     writer.flush();
 }

Points of Interest

  • Remote Access Methodology: We can access a client system through a server for which we will use Java networking.
  • Searching for Active User: We will search the whole network for the system running our client application par.
  • Getting access to all available user: Get connected to the users who are running client application part to perform the desire task.
  • Sharing Views: In this module, the server is shared throughout the active users.
  • Sharing File: File can be shared throughout the active users.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

Share

About the Author

devendra_sahu
Network Administrator
India India
No Biography provided

You may also be interested in...

Pro
Pro

Comments and Discussions

 
QuestionIs this an adaptation of work already on codeproject ? Pin
Darren_vms26-Aug-15 2:29
memberDarren_vms26-Aug-15 2:29 
AnswerRe: Is this an adaptation of work already on codeproject ? Pin
devendra_sahu14-Apr-16 16:52
professionaldevendra_sahu14-Apr-16 16:52 
QuestionWhy not VNC or RDP? Pin
webmaster44221-Aug-15 23:11
memberwebmaster44221-Aug-15 23:11 
QuestionFix The Images Pin
Kevin Marois21-Aug-15 4:59
professionalKevin Marois21-Aug-15 4:59 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Permalink | Advertise | Privacy | Terms of Use | Mobile
Web04 | 2.8.170915.1 | Last Updated 21 Aug 2015
Article Copyright 2015 by devendra_sahu
Everything else Copyright © CodeProject, 1999-2017
Layout: fixed | fluid