விண்டோஸ் கிளையன்ட்-சர்வர் பயன்பாடுகளின் செயல்பாட்டுடன் எழுதும் மென்பொருள், பகுதி 01

வாழ்த்துக்கள்.

டெல்நெட், டிஎஃப்டிபி, எட் செடெரா மற்றும் செடெரா போன்ற நிலையான விண்டோஸ் பயன்பாடுகளின் செயல்பாடுகளைச் செய்யும் கிளையன்ட்-சர்வர் பயன்பாடுகளை எழுதும் செயல்முறையை இன்று நான் பார்க்க விரும்புகிறேன். நான் புதிதாக எதையும் கொண்டு வரமாட்டேன் என்பது தெளிவாகிறது - இந்த பயன்பாடுகள் அனைத்தும் ஒரு வருடத்திற்கும் மேலாக வெற்றிகரமாக செயல்பட்டு வருகின்றன, ஆனால் ஹூட்டின் கீழ் என்ன நடக்கிறது என்பது அனைவருக்கும் தெரியாது என்று நான் நம்புகிறேன்.

இதுவே வெட்டின் கீழ் விவாதிக்கப்படும்.

இந்த கட்டுரையில், அதை இழுக்காமல் இருக்க, பொதுவான தகவல்களுக்கு மேலதிகமாக, நான் டெல்நெட் சேவையகத்தைப் பற்றி மட்டுமே எழுதுவேன், ஆனால் இந்த நேரத்தில் மற்ற பயன்பாடுகளிலும் பொருள் உள்ளது - இது தொடரின் மேலும் பகுதிகளில் இருக்கும்.

முதலில், டெல்நெட் என்றால் என்ன, அது எதற்குத் தேவை, எதற்காகப் பயன்படுத்தப்படுகிறது என்பதை நீங்கள் கண்டுபிடிக்க வேண்டும். நான் ஆதாரங்களை வார்த்தைகளில் மேற்கோள் காட்ட மாட்டேன் (தேவைப்பட்டால், கட்டுரையின் முடிவில் தலைப்பில் உள்ள பொருட்களுக்கான இணைப்பை இணைப்பேன்), டெல்நெட் சாதனத்தின் கட்டளை வரிக்கு தொலைநிலை அணுகலை வழங்குகிறது என்று மட்டுமே கூறுவேன். மொத்தத்தில், இங்குதான் அதன் செயல்பாடு முடிவடைகிறது (சர்வர் போர்ட்டை அணுகுவதைப் பற்றி நான் வேண்டுமென்றே மௌனம் காத்தேன்; அதைப் பற்றி பின்னர்). இதன் பொருள், அதை செயல்படுத்த, கிளையண்டில் ஒரு வரியை ஏற்க வேண்டும், அதை சேவையகத்திற்கு அனுப்ப வேண்டும், கட்டளை வரிக்கு அனுப்ப முயற்சிக்க வேண்டும், கட்டளை வரியின் பதிலைப் படிக்க வேண்டும், ஒன்று இருந்தால், அதை கிளையண்டிற்கு திருப்பி அனுப்ப வேண்டும். அதை திரையில் காண்பிக்கவும் அல்லது பிழைகள் இருந்தால், ஏதோ தவறு இருப்பதாக பயனருக்கு தெரியப்படுத்தவும்.

மேலே உள்ளவற்றைச் செயல்படுத்த, அதன்படி, எங்களுக்கு 2 வேலை வகுப்புகள் மற்றும் சில சோதனை வகுப்புகள் தேவை, அதில் இருந்து நாங்கள் சேவையகத்தைத் தொடங்குவோம், அதன் மூலம் கிளையன்ட் வேலை செய்யும்.
அதன்படி, இந்த நேரத்தில் பயன்பாட்டு கட்டமைப்பில் பின்வருவன அடங்கும்:

  • டெல்நெட் கிளையண்ட்
  • TelnetClientTester
  • டெல்நெட் சர்வர்
  • TelnetServerTester

அவை ஒவ்வொன்றின் வழியாகவும் செல்லலாம்:

டெல்நெட் கிளையண்ட்

பெறப்பட்ட கட்டளைகளை அனுப்புவது மற்றும் பெறப்பட்ட பதில்களைக் காண்பிப்பது மட்டுமே இந்த வகுப்பால் செய்ய முடியும். கூடுதலாக, நீங்கள் தொலை சாதனத்தின் தன்னிச்சையான (மேலே குறிப்பிட்டுள்ளபடி) போர்ட்டுடன் இணைக்க முடியும் மற்றும் அதிலிருந்து துண்டிக்க வேண்டும்.

இதை அடைய, பின்வரும் செயல்பாடுகள் செயல்படுத்தப்பட்டன:

சாக்கெட் முகவரியை ஒரு வாதமாக எடுத்து, இணைப்பைத் திறந்து, உள்ளீடு மற்றும் வெளியீட்டு ஸ்ட்ரீம்களைத் தொடங்கும் ஒரு செயல்பாடு (ஸ்ட்ரீம் மாறிகள் மேலே அறிவிக்கப்பட்டுள்ளன, முழு ஆதாரங்களும் கட்டுரையின் முடிவில் உள்ளன).

 public void run(String ip, int port)
    {
        try {
            Socket socket = new Socket(ip, port);
            InputStream sin = socket.getInputStream();
            OutputStream sout = socket.getOutputStream();
            Scanner keyboard = new Scanner(System.in);
            reader = new Thread(()->read(keyboard, sout));
            writer = new Thread(()->write(sin));
            reader.start();
            writer.start();
        }
        catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }

அதே செயல்பாட்டை ஓவர்லோட் செய்தல், இயல்புநிலை போர்ட்டுடன் இணைத்தல் - டெல்நெட்டிற்கு இது 23 ஆகும்


    public void run(String ip)
    {
        run(ip, 23);
    }

செயல்பாடு விசைப்பலகையில் இருந்து எழுத்துக்களைப் படித்து அவற்றை வெளியீட்டு சாக்கெட்டுக்கு அனுப்புகிறது - இது வழக்கமானது, வரி பயன்முறையில், எழுத்து முறை அல்ல:


    private void read(Scanner keyboard, OutputStream sout)
    {
        try {
            String input = new String();
            while (true) {
                input = keyboard.nextLine();
                for (char i : (input + " n").toCharArray())
                    sout.write(i);
            }
        }
        catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }

செயல்பாடு சாக்கெட்டிலிருந்து தரவைப் பெற்று திரையில் காண்பிக்கும்


    private void write(InputStream sin)
    {
        try {
            int tmp;
            while (true){
                tmp = sin.read();
                System.out.print((char)tmp);
            }
        }
        catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }

செயல்பாடு தரவு வரவேற்பு மற்றும் பரிமாற்றத்தை நிறுத்துகிறது


    public void stop()
    {
        reader.stop();
        writer.stop();
    }
}

டெல்நெட் சர்வர்

இந்த வகுப்பில் ஒரு சாக்கெட்டிலிருந்து ஒரு கட்டளையைப் பெறுதல், அதை செயல்படுத்துவதற்கு அனுப்புதல் மற்றும் கட்டளையிலிருந்து பதில் சாக்கெட்டுக்கு அனுப்புதல் போன்ற செயல்பாடுகள் இருக்க வேண்டும். நிரல் வேண்டுமென்றே உள்ளீட்டுத் தரவைச் சரிபார்க்கவில்லை, ஏனென்றால் முதலாவதாக, "பாக்ஸ்டு டெல்நெட்டில்" கூட சர்வர் டிஸ்க்கை வடிவமைக்க முடியும், இரண்டாவதாக, இந்த கட்டுரையில் பாதுகாப்பு பிரச்சினை கொள்கையளவில் தவிர்க்கப்பட்டது, அதனால்தான் இல்லை குறியாக்கம் அல்லது SSL பற்றி ஒரு வார்த்தை.

2 செயல்பாடுகள் மட்டுமே உள்ளன (அவற்றில் ஒன்று அதிக சுமை கொண்டது), பொதுவாக இது மிகவும் நல்ல நடைமுறை அல்ல, ஆனால் இந்த பணியின் நோக்கங்களுக்காக, எல்லாவற்றையும் அப்படியே விட்டுவிடுவது எனக்கு பொருத்தமானதாகத் தோன்றியது.

 boolean isRunning = true;
    public void run(int port)    {

        (new Thread(()->{ try {
            ServerSocket ss = new ServerSocket(port); // создаем сокет сервера и привязываем его к вышеуказанному порту
            System.out.println("Port "+port+" is waiting for connections");

            Socket socket = ss.accept();
            System.out.println("Connected");
            System.out.println();

            // Берем входной и выходной потоки сокета, теперь можем получать и отсылать данные клиенту.
            InputStream sin = socket.getInputStream();
            OutputStream sout = socket.getOutputStream();

            Map<String, String> env = System.getenv();
            String wayToTemp = env.get("TEMP") + "tmp.txt";
            for (int i :("Connectednnr".toCharArray()))
                sout.write(i);
            sout.flush();

            String buffer = new String();
            while (isRunning) {

                int intReader = 0;
                while ((char) intReader != 'n') {
                    intReader = sin.read();
                    buffer += (char) intReader;
                }


                final String inputToSubThread = "cmd /c " + buffer.substring(0, buffer.length()-2) + " 2>&1";


                new Thread(()-> {
                    try {

                        Process p = Runtime.getRuntime().exec(inputToSubThread);
                        InputStream out = p.getInputStream();
                        Scanner fromProcess = new Scanner(out);
                        try {

                            while (fromProcess.hasNextLine()) {
                                String temp = fromProcess.nextLine();
                                System.out.println(temp);
                                for (char i : temp.toCharArray())
                                    sout.write(i);
                                sout.write('n');
                                sout.write('r');
                            }
                        }
                        catch (Exception e) {
                            String output = "Something gets wrong... Err code: "+ e.getStackTrace();
                            System.out.println(output);
                            for (char i : output.toCharArray())
                                sout.write(i);
                            sout.write('n');
                            sout.write('r');
                        }

                        p.getErrorStream().close();
                        p.getOutputStream().close();
                        p.getInputStream().close();
                        sout.flush();

                    }
                    catch (Exception e) {
                        System.out.println("Error: " + e.getMessage());
                    }
                }).start();
                System.out.println(buffer);
                buffer = "";

            }
        }
        catch(Exception x) {
            System.out.println(x.getMessage());
        }})).start();

    }

நிரல் சர்வர் போர்ட்டைத் திறந்து, கட்டளை இறுதி எழுத்தை எதிர்கொள்ளும் வரை அதிலிருந்து தரவைப் படிக்கிறது, கட்டளையை ஒரு புதிய செயல்முறைக்கு அனுப்புகிறது மற்றும் வெளியீட்டை செயல்முறையிலிருந்து சாக்கெட்டுக்கு திருப்பிவிடும். எல்லாம் ஒரு கலாஷ்னிகோவ் தாக்குதல் துப்பாக்கி போல எளிமையானது.

அதன்படி, இயல்புநிலை போர்ட்டுடன் இந்த செயல்பாட்டிற்கு அதிக சுமை உள்ளது:

 public void run()
    {
        run(23);
    }

சரி, அதன்படி, சேவையகத்தை நிறுத்தும் செயல்பாடும் அற்பமானது, அது நித்திய வளையத்தை குறுக்கிட்டு, அதன் நிலையை மீறுகிறது.

    public void stop()
    {
        System.out.println("Server was stopped");
        this.isRunning = false;
    }

நான் இங்கே சோதனை வகுப்புகளை வழங்க மாட்டேன், அவை கீழே உள்ளன - அவர்கள் செய்வது பொது முறைகளின் செயல்பாட்டைச் சரிபார்க்க வேண்டும். எல்லாம் கிட்டில் உள்ளது.

சுருக்கமாக, இரண்டு மாலைகளில் முக்கிய கன்சோல் பயன்பாடுகளின் செயல்பாட்டின் கொள்கைகளை நீங்கள் புரிந்து கொள்ளலாம். இப்போது, ​​​​ஒரு தொலை கணினியில் டெலிநெட் செய்யும்போது, ​​​​என்ன நடக்கிறது என்பதை நாங்கள் புரிந்துகொள்கிறோம் - மந்திரம் மறைந்துவிட்டது)

எனவே, இணைப்புகள்:
எல்லா ஆதாரங்களும் இங்கே இருந்தன, உள்ளன மற்றும் இருக்கும்
டெல்நெட் பற்றி
டெல்நெட் பற்றி மேலும்

ஆதாரம்: www.habr.com

கருத்தைச் சேர்