{"id":36378,"date":"2019-10-31T22:11:20","date_gmt":"2019-10-31T19:11:20","guid":{"rendered":"https:\/\/prohoster.info\/blog\/napisanie-programmnogo-obespecheniya-s-funktsionalom-klient-servernyh-utilit-windows-part-01\/"},"modified":"2019-10-31T22:11:20","modified_gmt":"2019-10-31T19:11:20","slug":"napisanie-programmnogo-obespecheniya-s-funktsionalom-klient-servernyh-utilit-windows-part-01","status":"publish","type":"post","link":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/napisanie-programmnogo-obespecheniya-s-funktsionalom-klient-servernyh-utilit-windows-part-01","title":{"rendered":"Windowsi klient-server utiliitidega tarkvara kirjutamine, osa 01","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Tere.<\/p>\n<p>T\u00e4na tahaksime arutada kliendi-serveri rakenduste kirjutamise protsessi, mis t\u00e4idavad Windowsi standardsete utiliitide funktsioone nagu Telnet, TFTP jne, puhtas Javaski. On selge, et ma ei too midagi uut \u2014 k\u00f5ik need utiliidid on juba aastaid edukalt t\u00f6\u00f6tanud, kuid arvan, et mitte k\u00f5ik ei tea, mis nende taga toimub.<\/p>\n<p>Just sellest juttu tuleb. <br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nSelles artiklis, et mitte seda venitada, kirjutan ma ainult Telnet serverist, kuid hetkel on ka teisi utiliite, mille kohta on materjali \u2014 need tulevad hiljem sarja j\u00e4rgmistes osades.<\/p>\n<p>Esiteks, tuleks aru saada, mis on Telnet, milleks seda vaja on ja kuidas sellega \u00fcmber k\u00e4ia. Ma ei hakka allikaid s\u00f5na-s\u00f5nalt tsiteerima (kui vaja \u2014 lisatakse artikli l\u00f5pus lingid teemale), \u00fctlen vaid, et Telnet v\u00f5imaldab kaugjuurdep\u00e4\u00e4su seadme k\u00e4sureale. Suures osas sellega tema funktsionaalsus l\u00f5peb (serveri pordi juurde p\u00e4\u00e4semisest ma praegu ei r\u00e4\u00e4gi, sellest hiljem). Seega, selle rakendamiseks peame klientide kaudu v\u00f5tma andmearmu, edastama selle serverisse, proovima seda k\u00e4sureale edastada, lugema k\u00e4surea vastuse, kui see on olemas, edastama selle tagasi kliendile ja kuvama ekraanile v\u00f5i, kui tekib viga, teavitama kasutajat, et midagi on valesti.<\/p>\n<p>Selleks on vastavalt vaja kahte t\u00f6\u00f6tavat klassi ja \u00fchte testimis klassi, mille kaudu me serverit k\u00e4ivitame ja mille kaudu klient t\u00f6\u00f6tab.<br \/>\nSeega praeguse seisuga sisaldab rakenduse struktuur:<\/p>\n<ul>\n<li>TelnetClient<\/li>\n<li>TelnetClientTester<\/li>\n<li>TelnetServer<\/li>\n<li>TelnetServerTester<\/li>\n<\/ul>\n<p>\nVaatame iga\u00fcht neist l\u00e4hemalt:<\/p>\n<p><b>TelnetClient<\/b><\/p>\n<p>K\u00f5ik, mida see klass peaks oskama teha \u2014 edastada saadud k\u00e4ske ja n\u00e4idata saadud vastuseid. Lisaks peab olema v\u00f5imalik \u00fchendada v\u00e4gisi (nagu mainitud) kaugseadme pordiga ja sellest lahti \u00fchenduda.<\/p>\n<p>Selleks on rakendatud j\u00e4rgmised funktsioonid:<\/p>\n<p>Funktsioon, mis v\u00f5tab argumendiks pordi aadressi, avab \u00fchenduse ja k\u00e4ivitab sisendi ja v\u00e4ljundi voogude (voo muutujad on m\u00e4\u00e4ratud eespool, t\u00e4ielikud l\u00e4htekoodid \u2014 artikli l\u00f5pus).<\/p>\n<pre><code class=\"java\"> public void run(String ip, int port)\n    {\n        try {\n            Socket socket = new Socket(ip, port);\n            InputStream sin = socket.getInputStream();\n            OutputStream sout = socket.getOutputStream();\n            Scanner keyboard = new Scanner(System.in);\n            reader = new Thread(() -&gt; read(keyboard, sout));\n            writer = new Thread(() -&gt; write(sin));\n            reader.start();\n            writer.start();\n        }\n        catch (Exception e) {\n            System.out.println(e.getMessage());\n        }\n    }\n<\/code><\/pre>\n<p>\nSama funktsiooni \u00fclekoormamine, mis \u00fchendub vaikimisi pordiga \u2014 telnet jaoks on see 23<\/p>\n<pre><code class=\"java\">\n    public void run(String ip)\n    {\n        run(ip, 23);\n    }\n<\/code><\/pre>\n<p>\nFunktsioon loeb klaviatuurilt m\u00e4rke ja saadab need v\u00e4ljundpessa \u2014 nagu tavaks, reamoodulisse, mitte t\u00e4hem\u00e4rkimoodulisse:<\/p>\n<pre><code class=\"java\">\n    private void read(Scanner keyboard, OutputStream sout)\n    {\n        try {\n            String input = new String();\n            while (true) {\n                input = keyboard.nextLine();\n                for (char i : (input + \" n\").toCharArray())\n                    sout.write(i);\n            }\n        }\n        catch (Exception e) {\n            System.out.println(e.getMessage());\n        }\n    }\n<\/code><\/pre>\n<p>\nFunktsioon v\u00f5tab andmeid soketist ja kuvab need ekraanile<\/p>\n<pre><code class=\"java\">\n    private void write(InputStream sin)\n    {\n        try {\n            int tmp;\n            while (true){\n                tmp = sin.read();\n                System.out.print((char)tmp);\n            }\n        }\n        catch (Exception e) {\n            System.out.println(e.getMessage());\n        }\n    }\n<\/code><\/pre>\n<p>\nFunktsioon l\u00f5petab andmete vastuv\u00f5tmise ja edastamise<\/p>\n<pre><code class=\"java\">\n    public void stop()\n    {\n        reader.stop();\n        writer.stop();\n    }\n}<\/code><\/pre>\n<p>\n<b>TelnetServer<\/b><\/p>\n<p>See klass peaks olema v\u00f5imeline v\u00f5tma k\u00e4ske soketist, saatma need t\u00e4itmiseks ja edastama vastuse k\u00e4sust tagasi soketisse. Programmis ei ole teadlikult sissekandeid kontrollimist, kuna esiteks on 'karbitelevisioonis' v\u00f5imalik ketast formaadida ning teiseks, turvak\u00fcsimust ei k\u00e4sitleta selles artiklis \u00fcldse ja seet\u00f5ttu ei ole siin \u00fchtegi s\u00f5na kr\u00fcpteerimise v\u00f5i SSL-i kohta.<\/p>\n<p>Siin on ainult 2 funktsiooni (\u00fcks neist on \u00fclekoormatud), ja see ei ole \u00fcldiselt hea praktika, kuid antud \u00fclesande raames tundus m\u00f5istlik j\u00e4tta k\u00f5ik nii nagu on.<\/p>\n<pre><code class=\"java\"> boolean isRunning = true;\n    public void run(int port)    {\n\n        (new Thread(()-&gt;{ try {\n            ServerSocket ss = new ServerSocket(port); \/\/ loome serveri soketi ja seome selle \u00fclaltoodud sadamaga\n            System.out.println(\"Port \" + port + \" on ootamas \u00fchendusi\");\n\n            Socket socket = ss.accept();\n            System.out.println(\"\u00dchendatud\");\n            System.out.println();\n\n            \/\/ Saame sissetulevad ja v\u00e4ljaminevad soketi vood, n\u00fc\u00fcd saame klientidele andmeid edastada.\n            InputStream sin = socket.getInputStream();\n            OutputStream sout = socket.getOutputStream();\n\n            Map env = System.getenv();\n            String wayToTemp = env.get(\"TEMP\") + \"tmp.txt\";\n            for (int i : (\"Connectednnr\".toCharArray()))\n                sout.write(i);\n            sout.flush();\n\n            String buffer = new String();\n            while (isRunning) {\n\n                int intReader = 0;\n                while ((char) intReader != 'n') {\n                    intReader = sin.read();\n                    buffer += (char) intReader;\n                }\n\n\n                final String inputToSubThread = \"cmd \/c \" + buffer.substring(0, buffer.length() - 2) + \" 2&gt;&amp;1\";\n\n\n                new Thread(() -&gt; {\n                    try {\n\n                        Process p = Runtime.getRuntime().exec(inputToSubThread);\n                        InputStream out = p.getInputStream();\n                        Scanner fromProcess = new Scanner(out);\n                        try {\n\n                            while (fromProcess.hasNextLine()) {\n                                String temp = fromProcess.nextLine();\n                                System.out.println(temp);\n                                for (char i : temp.toCharArray())\n                                    sout.write(i);\n                                sout.write('n');\n                                sout.write('r');\n                            }\n                        }\n                        catch (Exception e) {\n                            String output = \"Midagi l\u00e4ks valesti... Viga kood: \" + e.getStackTrace();\n                            System.out.println(output);\n                            for (char i : output.toCharArray())\n                                sout.write(i);\n                            sout.write('n');\n                            sout.write('r');\n                        }\n\n                        p.getErrorStream().close();\n                        p.getOutputStream().close();\n                        p.getInputStream().close();\n                        sout.flush();\n\n                    }\n                    catch (Exception e) {\n                        System.out.println(\"Viga: \" + e.getMessage());\n                    }\n                }).start();\n                System.out.println(buffer);\n                buffer = \"\";\n\n            }\n        }\n        catch(Exception x) {\n            System.out.println(x.getMessage());\n        }})).start();\n\n    }\n<\/code><\/pre>\n<p>\nProgramm avab serveri porta, loeb andmeid, kuni j\u00f5uab k\u00e4su l\u00f5petamise s\u00fcmbolini, edastab k\u00e4su uude protsessi ja selle v\u00e4ljund suunatakse soketti. K\u00f5ik on sama lihtne nagu Kala\u0161nikovi automaat.<\/p>\n<p>Seega on selle funktsiooni jaoks olemas \u00fclekload vaikeportiga:<\/p>\n<pre><code class=\"java\"> public void run()\n    {\n        run(23);\n    }<\/code><\/pre>\n<p>\nJa seega on ka serveri peatamise funktsioon - k\u00f5ik on samuti triviaalne, see katkestab igavese ts\u00fckli, rikkudes selle tingimust.<\/p>\n<pre><code class=\"java\">    public void stop()\n    {\n        System.out.println(\"Server was stopped\");\n        this.isRunning = false;\n    }<\/code><\/pre>\n<p>\nMa ei hakka siin n\u00e4itama testklasse, need on all \u2014 k\u00f5ik, mida nad teevad, on kontrollida avalike meetodite t\u00f6\u00f6v\u00f5imet. K\u00f5ik on Gitis.<\/p>\n<p>Kokkuv\u00f5tteks, paaril \u00f5htul on v\u00f5imalik m\u00f5ista peamiste konsoolikasutustest tulenevaid p\u00f5him\u00f5tteid. N\u00fc\u00fcd, kui meil on telnet koos kaugolekuga, m\u00f5istame, mis toimub \u2014 maagia on kadunud)<\/p>\n<p>Nii et, lingid:<br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Toxa-p07a1330\/Temviewer\">K\u00f5ik l\u00e4htekoodid on, olid ja j\u00e4\u00e4vad siia<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/www.extrahop.com\/resources\/protocols\/telnet\/\">Telnetist<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/www.lifewire.com\/what-does-telnet-do-2483642\">Veel Telnetist<\/a><\/noindex><br \/>\n<br \/>Allikas: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/460569\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043a\u043b\u0438\u0435\u043d\u0442-\u0441\u0435\u0440\u0432\u0435\u0440\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u0443\u0442\u0438\u043b\u0438\u0442 Windows, \u043a\u0430\u043a \u0442\u043e Telnet, TFTP, et cetera, et cetera \u043d\u0430 \u0447\u0438\u0441\u0442\u043e\u0439 Jav\u0430. \u041f\u043e\u043d\u044f\u0442\u043d\u043e, \u0447\u0442\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u043e\u0432\u043e\u0433\u043e \u044f \u043d\u0435 \u043f\u0440\u0438\u0432\u043d\u0435\u0441\u0443 \u2014 \u0432\u0441\u0435 \u044d\u0442\u0438 \u0443\u0442\u0438\u043b\u0438\u0442\u044b \u0443\u0436\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043d\u0435 \u043e\u0434\u0438\u043d \u0433\u043e\u0434, \u043d\u043e, \u043f\u043e\u043b\u0430\u0433\u0430\u044e, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c \u0443 \u043d\u0438\u0445 \u0437\u043d\u0430\u044e\u0442 \u043d\u0435 \u0432\u0441\u0435. \u0418\u043c\u0435\u043d\u043d\u043e \u043e\u0431 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-36378","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043a\u043b\u0438\u0435\u043d\u0442-\u0441\u0435\u0440\u0432\u0435\u0440\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u0443\u0442\u0438\u043b\u0438\u0442 Windows, \u043a\u0430\u043a \u0442\u043e Telnet, TFTP, et cetera, et cetera \u043d\u0430 \u0447\u0438\u0441\u0442\u043e\u0439 Jav\u0430.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/napisanie-programmnogo-obespecheniya-s-funktsionalom-klient-servernyh-utilit-windows-part-01\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"et_EE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0433\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u0441 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u043e\u043c \u043a\u043b\u0438\u0435\u043d\u0442-\u0441\u0435\u0440\u0432\u0435\u0440\u043d\u044b\u0445 \u0443\u0442\u0438\u043b\u0438\u0442 Windows, part 01 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043a\u043b\u0438\u0435\u043d\u0442-\u0441\u0435\u0440\u0432\u0435\u0440\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u0443\u0442\u0438\u043b\u0438\u0442 Windows, \u043a\u0430\u043a \u0442\u043e Telnet, TFTP, et cetera, et cetera \u043d\u0430 \u0447\u0438\u0441\u0442\u043e\u0439 Jav\u0430.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/napisanie-programmnogo-obespecheniya-s-funktsionalom-klient-servernyh-utilit-windows-part-01\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T19:11:20+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:11:20+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Kliendi-serveri utiliitide funktsioonidega tarkvara kirjutamine, osa 01 | ProHoster","description":"Tere. T\u00e4na sooviksin arutada kliendi-serveri rakenduste kirjutamise protsessi, mis t\u00e4idavad Windowsi standardsete utiliitide funktsioone, nagu Telnet, TFTP jne, jne puhtas Javaskriptis.","canonical_url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/napisanie-programmnogo-obespecheniya-s-funktsionalom-klient-servernyh-utilit-windows-part-01","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"et_EE","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0433\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u0441 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u043e\u043c \u043a\u043b\u0438\u0435\u043d\u0442-\u0441\u0435\u0440\u0432\u0435\u0440\u043d\u044b\u0445 \u0443\u0442\u0438\u043b\u0438\u0442 Windows, part 01 | ProHoster","og:description":"\u041f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043a\u043b\u0438\u0435\u043d\u0442-\u0441\u0435\u0440\u0432\u0435\u0440\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u0443\u0442\u0438\u043b\u0438\u0442 Windows, \u043a\u0430\u043a \u0442\u043e Telnet, TFTP, et cetera, et cetera \u043d\u0430 \u0447\u0438\u0441\u0442\u043e\u0439 Jav\u0430.","og:url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/napisanie-programmnogo-obespecheniya-s-funktsionalom-klient-servernyh-utilit-windows-part-01","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T19:11:20+00:00","article:modified_time":"2019-10-31T19:11:20+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"36378","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-22 03:04:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 01:46:25","updated":"2026-01-22 03:04:19","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/36378","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/comments?post=36378"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/36378\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media?parent=36378"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/categories?post=36378"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/tags?post=36378"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}