الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

نظام يستطيع التحكم الكامل بالجهاز ..... البداية

مغلقمُجاب
بدأه hommeda في 1 نوفمبر 2013 · 5 رد · 1,750 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله تعالي وبركاتة

ماذا اذا كنت في حاجه الي حلول لامر استعصي عليك
قدم المعلومة واحصل علي الحلول
هذا هو العرض الاول
برمجة ال Client Server في لغة الجافا تعد من الامور السهلة والمبسطة في بدايتها ولكن سرعان ما يتعقد الامر
لدينا كود يقوم بالاتي :

من قبل    ServerThread

  • فتح منفذ port علي الجهاز في انتظار اتصال من ال Clients
  • يستلم رسالة نصية بعد قبول الاتصال ويفتح قناة اتصال لنفس Client الذي ارسل الرسالة
  • يدعم ال MultiClientlk

وهذا هو الكود البرمجي :

package client_server;
import java.io.*;
import java.net.*;
import java.util.Scanner;
public class Server {
    public static void main(String arg[]){
    try{
        int clientid=1;
        ServerSocket ss =new ServerSocket(7000,10);
        while(true){
        Socket s=ss.accept();
        System.out.println("conection stablish from clinet id:"+clientid);
        InetAddress clientaddress=s.getInetAddress();
        System.out.println("client ip address :  "+clientaddress.getHostAddress());
        clientthread ct=new clientthread(s,clientid);
      ct.start();
        clientid++;
        }}
    catch(IOException e){
    }}}
    class clientthread extends Thread{
        Scanner in=new Scanner(System.in);
        Socket s;
        int clientid;
        public clientthread(Socket s1,int id){
            s=s1;
            clientid=id;
        }
        @Override
        public void run(){
            try{
  DataInputStream fromclient=new DataInputStream(s.getInputStream());
 DataOutputStream toclient=new DataOutputStream(s.getOutputStream());
 while(true){
     String num=fromclient.readUTF();
     System.out.println("Student "+num+"\n");
     System.out.println("write number to send to client ip :"+s.getInetAddress()+" :\n"  );
     String numroot=in.nextLine();
     toclient.writeUTF(numroot);
     toclient.flush();
     System.out.print("\n");
 }}
            catch(IOException e){
}}}

من قبل ال Client
بعد عملية الاتصال
يقوم باستلام الرسالة من الserver

ثم يقوم بقوم بعدة عمليات حيث يقوم بمطابقة الرسالة مع قيم بعض المتغيرات المعرفه في الكلاس مثلا اذا قام السيرفر بارسال الرسالة  shutdown فبعد عملية المقارنة نجد ان النص يعني تنفيذ الدالة SYScontrol.shutdown() التي تقوم باغلاق الجهاز فوريا

كود

String sr=fromserver.readUTF();
             int result = sr.compareTo( str2 );
        if(result==0){
                
                    SYScontrol.shutdown();
                
        }

حيث ان قيمة المتغير str2="shutdown"

,وهكذا طريقة التحكم في اكواد البرنامج عن طريق المطابقة النصية للاوامر المرسلة من السيرفر

يتم التحكم في الجهاز بارسال الاوامر من الكلاس SYScontrol عبر تنفيذ اجراء محدد بالدالة التالية

 Process p=Runtime.getRuntime().exec("cmd /c shutdown -s -t 90");

مثلا  الدالة  shutdwon  هي من class SYScontrol اقوم بتنفيذ امر الاغلاق علي الجهاز

كود :

    //this Function to Shutdon Client pc
public static void shutdown() throws IOException, InterruptedException{
    Process p=Runtime.getRuntime().exec("cmd /c shutdown -s -t 9000");
                p.waitFor();
}

حيث تقوم باغلق الجهاز بعد 15 دقيقة

 

وايضا اخذ صورة من الجهاز تتم بالصورة التالية :

  1. يقوم السيرفر بارسال رسال نصية تحتوي علي الامر ScreenCaptur
  2. وكما ذكرنا سابقا يحلل الclient الرساله ويجد انها تتطابق قيمة  المتغير str3
  3. نتيجة للمطابقة يستدعي الclient الدالة   CapturScrean
  4. تقوم الداه باخذ صوره من الشاشة وحفظها في الجهاز

كود :

public static void ScreanCaptur() throws AWTException, UnsupportedFlavorException, IOException{
    
        try {
            Thread.sleep(1000 * 2);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }

        Robot robot = new Robot();

        robot.keyPress(KeyEvent.VK_ALT);
        robot.keyPress(KeyEvent.VK_PRINTSCREEN);
        robot.keyRelease(KeyEvent.VK_PRINTSCREEN);
        robot.keyRelease(KeyEvent.VK_ALT);

        try {
            Thread.sleep(1000 * 2);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
                Transferable t = Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null);
        RenderedImage image = (RenderedImage) t.getTransferData(DataFlavor.imageFlavor);

        boolean isSuccess = ImageIO.write(image, "png", new File("altScreen.png"));

ملاحظة :

يتم اخذ الصورة للنافذة النشطة فقط في هذا الكود

ويمكنك اخذ صورة لكامل الشاشه بحذف الاتي :
 

 robot.keyPress(KeyEvent.VK_ALT);
        robot.keyRelease(KeyEvent.VK_ALT);

حيث يقوم بالضغط علي المفتاح  PRINTSCREEN فقط

يتم حفظ الصورة في مسار البرنامج باسم altScreen وياخذ المتغير المنظقي isSuccess القيمة true الذي يستخدم لمعرفة نجاح العملية لاستخدامة في ما بعد

 

وهذا هو الكلاس client

 

كود:

//mosap hommeda
/* this code write by csa6 Group
 *
 */
public class Client {
public static void main(String arg[]) throws AWTException, UnsupportedFlavorException, InterruptedException{
    try{
        String Nikname,str2="shutdown",str3="ScreenCaptur";
        
        Socket s=new Socket("localhost",7000);
        PrintWriter out =  new PrintWriter(  new BufferedWriter(new OutputStreamWriter (s.getOutputStream() ) ), true);
        Scanner n=new Scanner(System.in);
        SYScontrol SYS=new SYScontrol();
        DataInputStream fromserver=new DataInputStream(s.getInputStream());
        DataOutputStream toserver=new DataOutputStream(s.getOutputStream());
        System.out.println("please Enter Your Name\n");
        Nikname=n.nextLine();
        for(int i=0;i<10;i++){
            System.out.print("\n Write Message here to send to Tachear\n");
            String QU=n.nextLine();
            toserver.writeUTF(Nikname+" :"+QU);
            toserver.flush();
            String sr=fromserver.readUTF();
             int result = sr.compareTo( str2 );
        if(result==0){
                
                    SYScontrol.shutdown();
                
        }else {
            result =sr.compareTo( str3 );
            if(result==0){
                SYScontrol.ScreanCaptur();
            }
            System.out.println("\n teacher send  = : "+sr+"\n");
        }
        }
        
    }
    catch(IOException e){
    }}

}

وهذا هو كلاس SYScontrol

 

كود :

import java.awt.AWTException
public class SYScontrol {
    
    //this Function to Shutdon Client pc
public static void shutdown() throws IOException, InterruptedException{
    Process p=Runtime.getRuntime().exec("cmd /c shutdown -s -t 9000");
                p.waitFor();
}   
//this Function to Restart Client pc
public static void restart() throws IOException, InterruptedException{
    Process p=Runtime.getRuntime().exec("cmd /c shutdown -r -t 9000");
                p.waitFor();
    
}
//this Function to Captur Photo from Screan Client pc
public static void ScreanCaptur() throws AWTException, UnsupportedFlavorException, IOException{
    
        try {
            Thread.sleep(1000 * 2);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }

        Robot robot = new Robot();

        robot.keyPress(KeyEvent.VK_ALT);
        robot.keyPress(KeyEvent.VK_PRINTSCREEN);
        robot.keyRelease(KeyEvent.VK_PRINTSCREEN);
        robot.keyRelease(KeyEvent.VK_ALT);

        try {
            Thread.sleep(1000 * 2);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
                Transferable t = Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null);
        RenderedImage image = (RenderedImage) t.getTransferData(DataFlavor.imageFlavor);

        boolean isSuccess = ImageIO.write(image, "png", new File("altScreen.png"));

  JFrame frame = new JFrame("Display image");
  Panel panel = new VeidoShow();
  frame.getContentPane().add(panel);
  frame.setSize(1366,768);
  frame.setVisible(true);
 System.out.println(isSuccess);
    
}}
 class VeidoShow extends Panel {
  BufferedImage  image;
  public VeidoShow() {
  try {
  //System.out.println("Enter image name\n");
  BufferedReader bf=new BufferedReader(new
InputStreamReader(System.in));
 //String imageName=bf.readLine();
  File input = new File("altScreen.png");
  image = ImageIO.read(input);
  } catch (IOException ie) {
  System.out.println("Error:"+ie.getMessage());
  }
  }

     @Override
  public void paint(Graphics g) {
  g.drawImage( image, 0, 0, null);
  }



يتم عرض الصورة في جهاز الclient وهو ليس المطلوب ولكن تم ذالك لمحاولة توضيع عمل الدالة


من خلال هذا المشروع ارغب في عمل نظام يستطيع التحكم الكامل بالجهاز .... ليس جهاز واحد وانما عدة اجهزة ..
قمت بكتابة العديد من الاكواد الاخري مثل استطاعة السيرفر ارسال واستقبال الملفات الي الاجهزة عن طريق برتكول الUDP واكواد اخري عديدة سوف اعرضها عند الحاجة اليها

 

ما اود معرفتة هو هل يبدو هذا المشروع في خط السير الصحيح مع العلم انني قمت بعملية تحليل كامل للنظام ووجد الاشادة من بعض ذوي الخبرة  والان ارغب في جمع جميع الاكواد اللازمة قبل البدء في التصميم بالواجهات الرسومية

 

إن شاء الله بعد عرض البداية اليكم سوف اقوم بإنزال الاكواد الاخري للتحكم في الجهاز وانتظار ارائكم المهمة جدا بالنسبة لي

 

في انتظار ارائكم وتوجيهاتكم ايها الاعضاء الكرام
 حاولت تبسيط فكرة الموضوع والاكواد بقدر الامكان حتي تصل الفكرة الي أعضاء المنتدي الكرام

اعتذر عن اخطاء قد اقع بها فانا لم اعتاد بعد علي الكتابة في هذا المنتدي ......
ولكم مني جزيل الشكر مقدما ...

1
#2

شكرا أخي الكريم واهلا وسهلا بك في هذا المنتدى

 

شرح جميل ومتعوب عليه بارك الله بك

لدي سؤال وهو انه هل هذه الاكواد كي يتم التحكم بالجهاز عن بعد؟؟؟

إذا نظــرتَ نيـوب اللـّيـثِ بـارزةً         فـلا تظــنَنَ أَنَّ اللـّيـــثَ يبْتسـِـــمُ


 


 


رسم المخططات البيانية بواسطة الجافا


 


كتاب تحليل وتصميم نظم المعلومات


#3 أفضل إجابة

السلام عليكم

 

مرحبا بك أخي الكريم في منتديات الفريق العربي للبرمجة :)

 

أولا, إذا كنتَ تريد برمجة سيرفر فعال, يتحكم في مجموعة أجهزة فيجب عليك استخدام الـ Multithreading في كلا الطرفين (السيرفر و الـ client أيضا), في الحالة المعاكسة مثلا قد لا تتمكن من إطلاق عدة نسخ من السيرفر في نفس الـ main.

ثانيا, ما دمتَ تريد التحكم في مجموعة أجهزة عن بعد فلا يجوز لك أن تكتب فئة الـ client داخل فئة السيرفر, أنصحك بكتابة فئة خاصة بالسيرفر و أخرى خاصة بالـ client حتى يُصبح الكود سهل القراءة و أكثر تنظيماً.

 

هذا مثال كتبتُه لك ع السريع ..

عند تشغيل السيرفر, ينتظر اتصال الـ clients حيث يتبادل معهم الرسائل التي يُرسلها كل واحد على حدة و لإنهاء الإتصال يكفي أن يُرسل الزبون إلى السيرفر رسالة فارغة (مجرد ضغطة خفيفة على enter).

 

و هذه فئة السيرفر :

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class ServeurTCP extends Thread {

    private PrintWriter fluxSortie;
    private Socket client;
    private BufferedReader fluxEntree;
    private String mesrec;

    public ServeurTCP(Socket client) {
        try {
            this.client = client;
            System.out.println("Traitement avec le client " + client.getLocalSocketAddress());
            fluxEntree = new BufferedReader(new InputStreamReader(client.getInputStream()));
            fluxSortie = new PrintWriter(client.getOutputStream(), true);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public void run() {
        try {
            try {
                traitement();
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void traitement() {
        try {
            mesrec = fluxEntree.readLine();
            if (mesrec.trim().equals("")) {
                System.out.println("Le client " + client.getRemoteSocketAddress() + " a quitté la conversation.");
                fluxSortie.println("Fin du service.");
                try {
                    client.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            } else {
                System.out.println("Le client " + client.getRemoteSocketAddress() + " a envoyé : " + mesrec);
                fluxSortie.println("Merci de votre message, j' ai bien reçu : " + mesrec);
            }
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

    public static void main(String[] args) throws IOException {
        ServerSocket socketServeur = new ServerSocket(7900);
        System.out.println("Demarrage du serveur... \nServeur en attente des clients ...");
        Socket socketClient;
        while (true) {
            try {
                socketClient = socketServeur.accept();
                new ServeurTCP(socketClient).start();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

وفئة الـ client كالتالي :

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

public class ClientTCP extends Thread {

    private Socket client;
    private BufferedReader fluxEntree;
    private PrintWriter fluxSortie;
    private Scanner src = new Scanner(System.in);
    private String messageRecu, messageEnvoye;
    private boolean termineSocket = false;

    @Override
    public void run() {

        try {
            while (true) {
                client = new Socket("localhost", 7900);
                fluxEntree = new BufferedReader(new InputStreamReader(client.getInputStream()));
                fluxSortie = new PrintWriter(client.getOutputStream(), true);
                System.out.print("Tapez le message que vous voulez envoyer au serveur : ");
                messageEnvoye = src.nextLine();
                if (messageEnvoye.trim().equals("")) {
                    termineSocket = true;
                }

                fluxSortie.println(messageEnvoye);
                messageRecu = fluxEntree.readLine();
                System.out.println(messageRecu);

                if (termineSocket) {
                    client.close();
                    break;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        new ClientTCP().start();
    }
}

حتى اللحظة يمكننا القول بأننا نتعامل مع مجموعة خربشات جميلة بالجافا لكنها في الحقيقة, ليست بداية فعلية لمشروع حقيقي .. لأن الخطوات الأولى للمشروع تتطلب أولا كتابة الـ Scope Statement ثم البدء في مرحلة الـ designing باستخدام UML مثلا و تأتي بعد ذلك مرحلة البرمجة و كتابة الأكواد حيث تُعتبر من آخر مراحل المشروع.

أيضا, لا تستخدم الـ Sockets في برمجة هذا المشروع إن كنت تنوي برمجته كـ distributed application أو إن كنت تهتم بالناحية الأمنية بالإضافة إلى سرعة و كفاءة البرنامج.

أقترح علبك استخدام الـ RMI مثلا.

 

بالنسبة لاستخدام أوامر DOS في جافا فيجب عليك الانتباه لأنه في أغلب الأحيان, لا يتم تشغيل التطبيق كـ root و بالتالي سيتم إصدار الـ system error رقم 5 و الذي يعني أنك لا تملك الصلاحيات الكافية لتنفيذ الأمر. هذا من ناحية. من ناحية أخرى, أرى أنه من الأفضل إعادة النظر في الأمر المُراد تنفيذه لأنه يختلف باختلاف نظام التشغيل.

شخصيا, أفضل كتابة الفئة المسؤولة عن إيقاف تشغيل الجهاز هكذا :
 

public class EteindrePC {

    public static void main(String[] args) throws Exception {
        String commande;
        String operatingSystem = System.getProperty("os.name");
        System.out.println(operatingSystem);
        // Sous Windows
        if (operatingSystem.startsWith("Windows")) {
            commande = "shutdown.exe -s -t 0";
        } // Sous Linux ou Mac
        else if (operatingSystem.startsWith("Linux") || operatingSystem.startsWith("Mac OS X")) {
            commande = "shutdown -h now";
        } else {
            throw new RuntimeException("Impossible d'éteindre ce PC");
        }
        Runtime.getRuntime().exec(commande);
        System.exit(0);
    }
}

تم تعديل هذه المشاركة بواسطة Snack3r في 25 يناير 2014 في 12:22

2 −1
#4
vector_ever كتب:

شكرا أخي الكريم واهلا وسهلا بك في هذا المنتدى

 

شرح جميل ومتعوب عليه بارك الله بك

لدي سؤال وهو انه هل هذه الاكواد كي يتم التحكم بالجهاز عن بعد

نعم اخي هو بدايه لنظام كامل للتحكم بالجهاز عن بعد داخل شبكة محلية

#5

,وعليكم السلام

Snack3r

اولا اشكرك علي هذا الرد الجميل والرائع الذي استفد منه الكثير
انتظرت حتي احول تجربة جميع ما قلت
كود السيرفر الذي ارسلتة اكثر من رائع وقد قمت باضافة بعض الاكواد منة الي الاكواد التي لدي وكانت النتيجه اكثر من رائعة
اضيف اليك ان النظام محلل والتحليل شبة جاهز باستخدام uml  بصورة جيدة
كما ان تصميم الواجهات الرسوميه يقوم بها اشخاص اخرون فنحن نعمل  كفريق اجايل ورغم تداخل المهام الا انني افضل العمل مع الاكواد فقطم

 

كود ايقاف التشغيل فضلت اضافة الكود الذي اضفتة علي الكود السابق
انتظر علي عجل تعليقاتك علي كود الصورة فانا احاول تعديل ارسال الصورة ال ارسال فيديو تصوير الشاشة
لدي كود من المنتدي لكن لايقوم بضغط الصور وانما يقوم بارسالها كما هي ما يجعله الحجم كبير جدا ويؤدي الي بطء في التنفيذ علي الشبكة المحلية

#6

لا شكر على واجب أخي الكريم :)

 

حتى لا يتشعب الموضوع, اكتب سؤالا جديداً حول كيفية إرسال صورة باستخدام Sockets و إن شاء الله ستجد الإجابة.

 

 

بالتوفيق.

هذا الموضوع مغلق.

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…