{"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\/ro\/blog\/administrirovanie\/napisanie-programmnogo-obespecheniya-s-funktsionalom-klient-servernyh-utilit-windows-part-01","title":{"rendered":"Scrierea software-ului cu func\u021bionalit\u0103\u021bi de utilit\u0103\u021bi client-server Windows, partea 01","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Salut.<\/p>\n<p>Ast\u0103zi a\u0219 dori s\u0103 discut despre procesul de scriere a aplica\u021biilor client-server, care \u00eendeplinesc func\u021biile standard ale utilitarurilor Windows, cum ar fi Telnet, TFTP \u0219i altele, utiliz\u00e2nd Java pur. Este clar c\u0103 nu aduc nimic nou \u2014 toate aceste utilitare func\u021bioneaz\u0103 cu succes de ani buni, dar cred c\u0103 nu toat\u0103 lumea \u0219tie ce se \u00eent\u00e2mpl\u0103 sub capot\u0103.<\/p>\n<p>Exact despre asta vom vorbi mai departe. <br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\n\u00cen acest articol, pentru a nu-l lungi, pe l\u00e2ng\u0103 informa\u021biile generale, voi scrie doar despre serverul Telnet, dar momentan exist\u0103 \u0219i materiale despre alte utilitare \u2014 acestea vor fi \u00een p\u0103r\u021bile ulterioare ale ciclului.<\/p>\n<p>\u00cen primul r\u00e2nd, trebuie s\u0103 ne l\u0103murim ce este Telnet, la ce folose\u0219te \u0219i cum func\u021bioneaz\u0103. Nu voi cita sursele literar (dac\u0103 este necesar \u2014 la sf\u00e2r\u0219itul articolului voi ata\u0219a linkuri c\u0103tre materiale pe aceast\u0103 tem\u0103), voi spune doar c\u0103 Telnet asigur\u0103 accesul la linia de comand\u0103 a dispozitivului de la distan\u021b\u0103. Pe scurt, aceasta este limita func\u021bionalit\u0103\u021bii sale (voi omite deliberat referirea la portul serverului, despre care voi discuta mai t\u00e2rziu). A\u0219a c\u0103, pentru a-l implementa, trebuie s\u0103 primim un \u0219ir pe client, s\u0103-l trimitem pe server, s\u0103 \u00eencerc\u0103m s\u0103-l trimitem \u00een linia de comand\u0103, s\u0103 citim r\u0103spunsul din linia de comand\u0103, dac\u0103 exist\u0103, s\u0103-l trimitem \u00eenapoi pe client \u0219i s\u0103-l afi\u0219\u0103m pe ecran, sau, \u00een cazul \u00een care apare o eroare, s\u0103 inform\u0103m utilizatorul c\u0103 ceva nu este \u00een regul\u0103.<\/p>\n<p>Pentru a implementa cele de mai sus, avem nevoie de 2 clase func\u021bionale \u0219i de o clas\u0103 de testare din care vom lansa serverul \u0219i prin care va func\u021biona clientul.<br \/>\nPrin urmare, \u00een acest moment, structura aplica\u021biei include:<\/p>\n<ul>\n<li>TelnetClient<\/li>\n<li>TelnetClientTester<\/li>\n<li>TelnetServer<\/li>\n<li>TelnetServerTester<\/li>\n<\/ul>\n<p>\nS\u0103 trecem \u00een revist\u0103 fiecare dintre ele:<\/p>\n<p><b>TelnetClient<\/b><\/p>\n<p>Tot ce trebuie s\u0103 fac\u0103 aceast\u0103 clas\u0103 este s\u0103 trimit\u0103 comenzile primite \u0219i s\u0103 afi\u0219eze r\u0103spunsurile primite. De asemenea, trebuie s\u0103 \u0219tie s\u0103 se conecteze la un port ales (despre care am vorbit mai sus) al unui dispozitiv de la distan\u021b\u0103 \u0219i s\u0103 se deconecteze de la el.<\/p>\n<p>Pentru aceasta, au fost implementate urm\u0103toarele func\u021bii:<\/p>\n<p>Func\u021bia care prime\u0219te ca argument adresa socket-ului, deschide conexiunea \u0219i porne\u0219te fluxurile de intrare \u0219i ie\u0219ire (variabilele fluxului sunt declarate mai sus, sursele complete \u2014 la sf\u00e2r\u0219itul articolului).<\/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>\nSuprascrierea acelea\u0219i func\u021bii, conect\u00e2ndu-se la portul implicit \u2014 pentru telnet acesta este 23<\/p>\n<pre><code class=\"java\">\n    public void run(String ip)\n    {\n        run(ip, 23);\n    }\n<\/code><\/pre>\n<p>\nFunc\u021bia cite\u0219te caractere de la tastatur\u0103 \u0219i le trimite pe socket-ul de ie\u0219ire \u2014 ceea ce este caracteristic, \u00een modul de linie, nu de caracter:<\/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>\nFunc\u021bia prime\u0219te date de pe socket \u0219i le afi\u0219eaz\u0103 pe ecran<\/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>\nFunc\u021bia opre\u0219te primirea \u0219i transmiterea de date<\/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>Aceast\u0103 clas\u0103 ar trebui s\u0103 aib\u0103 func\u021bionalitatea de a primi comenzi de pe socket, de a le trimite spre execu\u021bie \u0219i de a trimite r\u0103spunsul comenzii \u00eenapoi pe socket. \u00cen program, inten\u021bionat nu exist\u0103 verificare a datelor de intrare, deoarece, pe de-o parte, \u00een \u201etelnet-ul de cutie\u201d exist\u0103 posibilitatea de a formata discul serverului, iar pe de alt\u0103 parte, problema securit\u0103\u021bii este omis\u0103 \u00een acest articol, de aceea nu exist\u0103 niciun cuv\u00e2nt despre criptare sau SSL.<\/p>\n<p>Aici sunt doar 2 func\u021bii (una dintre ele este suprascris\u0103), \u0219i, \u00een general, aceasta nu este o practic\u0103 foarte bun\u0103, dar \u00een cadrul acestei sarcini mi s-a p\u0103rut adecvat s\u0103 las totul a\u0219a cum este.<\/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); \/\/ cre\u0103m socketul serverului \u0219i \u00eel leg\u0103m de portul specificat\n            System.out.println(\"Port \" + port + \" a\u0219teapt\u0103 conexiuni\");\n\n            Socket socket = ss.accept();\n            System.out.println(\"Conectat\");\n            System.out.println();\n\n            \/\/ Ob\u021binem fluxurile de intrare \u0219i ie\u0219ire ale socket-ului, acum putem primi \u0219i trimite date clientului.\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 : (\"Conectatnnr\".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                final String inputToSubThread = \"cmd \/c \" + buffer.substring(0, buffer.length() - 2) + \" 2&gt;&amp;1\";\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                        } catch (Exception e) {\n                            String output = \"Ceva nu a mers bine... Cod eroare: \" + 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                    } catch (Exception e) {\n                        System.out.println(\"Eroare: \" + 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>\nProgramul deschide un port de server, cite\u0219te date de la acesta p\u00e2n\u0103 \u00eent\u00e2lne\u0219te simbolul de sf\u00e2r\u0219it al comenzii, transmite comanda \u00eentr-un nou proces, iar ie\u0219irea din proces este direc\u021bionat\u0103 c\u0103tre socket. Totul este la fel de simplu ca un automat Kalashnikov.<\/p>\n<p>Prin urmare, pentru aceast\u0103 func\u021bie exist\u0103 o suprasarcin\u0103 cu un port implicit:<\/p>\n<pre><code class=\"java\"> public void run()\n    {\n        run(23);\n    }<\/code><\/pre>\n<p>\n\u0218i, prin urmare, func\u021bia care opre\u0219te serverul este, de asemenea, trivial\u0103, aceasta \u00eentrerupe bucla infinit\u0103, \u00eenc\u0103lc\u00e2nd condi\u021bia acesteia.<\/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>\nNu voi aduce exemple de clase de test aici, acestea sunt prezentate mai jos \u2014 tot ce fac este s\u0103 verifice func\u021bionalitatea metodelor publice. Totul este pe Git.<\/p>\n<p>Rezum\u00e2nd, \u00een c\u00e2teva seri putem \u00een\u021belege principiile de func\u021bionare ale principalelor utilitare de consol\u0103. Acum, c\u00e2nd ne conect\u0103m la un computer remote, \u00een\u021belegem ce se \u00eent\u00e2mpl\u0103 \u2014 magia a disp\u0103rut)<\/p>\n<p>A\u0219adar, linkurile:<br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Toxa-p07a1330\/Temviewer\">Toate sursele au fost, sunt \u0219i vor fi aici<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/www.extrahop.com\/resources\/protocols\/telnet\/\">Despre Telnet<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/www.lifewire.com\/what-does-telnet-do-2483642\">\u00cenc\u0103 despre Telnet<\/a><\/noindex><br \/>\n<br \/>Sursa: <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.2.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\/ro\/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.2.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"ro_RO\" \/>\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\/ro\/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\udd47Scrierea software-ului cu func\u021bionalitate de utilitare client-server Windows, parte 01 | ProHoster","description":"Salut. Ast\u0103zi a\u0219 dori s\u0103 discut despre procesul de scriere a aplica\u021biilor client-server care \u00eendeplinesc func\u021biile standardelor utilitare Windows, precum Telnet, TFTP, etc., etc. pe Java curat\u0103.","canonical_url":"https:\/\/prohoster.info\/ro\/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":"ro_RO","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\/ro\/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\/ro\/wp-json\/wp\/v2\/posts\/36378","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/comments?post=36378"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/36378\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media?parent=36378"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/categories?post=36378"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/tags?post=36378"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}