{"id":590,"date":"2005-03-08T06:35:00","date_gmt":"2005-03-08T13:35:00","guid":{"rendered":"http:\/\/kodegeek.com\/blog\/?p=590"},"modified":"2005-03-08T06:35:00","modified_gmt":"2005-03-08T13:35:00","slug":"echando-codigo-escribir-un-servidor-sencillo-en-java","status":"publish","type":"post","link":"http:\/\/kodegeek.com\/blog\/2005\/03\/08\/echando-codigo-escribir-un-servidor-sencillo-en-java\/","title":{"rendered":"Echando c\u00f3digo: Escribir un servidor sencillo en Java"},"content":{"rendered":"<p>Esta es una t\u00edpica pregunta de entrevista de programaci\u00f3n: Escriba un servidor sencillo en Java, el cual est\u00e9 en capacidad de atender a varios clientes a la vez.<\/p>\n<p>El truco aqui es abstraer la definici\u00f3n de una tarea; El servidor recibe la nueva conexi\u00f3n (un Socket) y es all\u00ed en donde deber\u00edamos crear una nueva hebra de ejecuci\u00f3n (Thread) para atender al cliente. Por supuesto, como el tiempo es corto no le van a pedir que maneje los siguientes casos:<\/p>\n<ul>\n<li>Seguridad (como controlar quien se conecta)<\/li>\n<li>Optimizaciones: Piscinas de hebras de ejecuci\u00f3n (thread pools)<\/li>\n<li>Registro de eventos<\/li>\n<li>Inicializaci\u00f3n, finalizaci\u00f3n del servidor<\/li>\n<\/ul>\n<p> Pero el que no le pidan la implementaci\u00f3n no significa que usted al menos no deberia al menos saber como hacerlo (le pueden preguntar la idea general).<\/p>\n<p>El sitio de <a href=\"http:\/\/java.sun.com\">Java<\/a> tiene tutoriales extremadamente completos sobre Sockets, as\u00ed que esta vez yo s\u00f3lo me voy a limitar a colcarles el c\u00f3digo aqui y un enlace para que se lo baje. Yo utilic\u00e9 un n\u00famero mayor que 1024 en el puerto de manera que usted pueda correr este demonio <span style=\"font-style: italic;\">sin ser root<\/span>.<\/p>\n<p>Veamos entonces la divisi\u00f3n de tareas; Primero definimos una tarea la cual es la que actualmente hace el trabajo:<\/p>\n<style type=\"text\/css\"><!-- .syntax0 { color: #000000; } .syntax1 { color: #cc0000; } .syntax2 { color: #ff8400; } .syntax3 { color: #6600cc; } .syntax4 { color: #cc6600; } .syntax5 { color: #ff0000; } .syntax6 { color: #9966ff; } .syntax7 { background: #ffffcc; color: #ff0066; } .syntax8 { color: #006699; font-weight: bold; } .syntax9 { color: #009966; font-weight: bold; } .syntax10 { color: #0099ff; font-weight: bold; } .syntax11 { color: #66ccff; font-weight: bold; } .syntax12 { color: #02b902; } .syntax13 { color: #ff00cc; } .syntax14 { color: #cc00cc; } .syntax15 { color: #9900cc; } .syntax16 { color: #6600cc; } .syntax17 { color: #0000ff; } .syntax18 { color: #000000; font-weight: bold; } .gutter { background: #dbdbdb; color: #000000; } .gutterH { background: #dbdbdb; color: #666699; } --><br \/><\/style>\n<p><\/p>\n<pre><span class=\"gutter\">   1:<\/span><span class=\"syntax9\">import<\/span> java.io.IOException;<br \/><span class=\"gutter\">   2:<\/span><span class=\"syntax9\">import<\/span> java.io.OutputStream;<br \/><span class=\"gutter\">   3:<\/span><span class=\"syntax9\">import<\/span> java.io.InputStream;<br \/><span class=\"gutter\">   4:<\/span><span class=\"syntax9\">import<\/span> java.io.PrintWriter;<br \/><span class=\"gutterH\">   5:<\/span><span class=\"syntax9\">import<\/span> java.io.BufferedReader;<br \/><span class=\"gutter\">   6:<\/span><span class=\"syntax9\">import<\/span> java.io.InputStreamReader;<br \/><span class=\"gutter\">   7:<\/span><br \/><span class=\"gutter\">   8:<\/span><span class=\"syntax9\">import<\/span> java.net.Socket;<br \/><span class=\"gutter\">   9:<\/span><span class=\"syntax3\">\/**<\/span><br \/><span class=\"gutterH\">  10:<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">This<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">class<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">takes<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">care<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">of<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">a<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">client<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">connecting<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">to<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">the<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">server<\/span><span class=\"syntax3\">.<\/span><br \/><span class=\"gutter\">  11:<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">License<\/span><span class=\"syntax3\">:<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">GPL<\/span><br \/><span class=\"gutter\">  12:<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">Blog<\/span><span class=\"syntax3\">:<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">El<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">Angel<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">Negro<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">-<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">http<\/span><span class=\"syntax3\">:<\/span><span class=\"syntax3\">\/<\/span><span class=\"syntax3\">\/<\/span><span class=\"syntax3\">elangelnegro<\/span><span class=\"syntax3\">.<\/span><span class=\"syntax3\">blogspot<\/span><span class=\"syntax3\">.<\/span><span class=\"syntax3\">com<\/span><br \/><span class=\"gutter\">  13:<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax12\">@author<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">Jose<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">V<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">Nunez<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">Z<\/span><br \/><span class=\"gutter\">  14:<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax12\">@version<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">0<\/span><span class=\"syntax3\">.<\/span><span class=\"syntax3\">1<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">-<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">02<\/span><span class=\"syntax3\">\/<\/span><span class=\"syntax3\">28<\/span><span class=\"syntax3\">\/<\/span><span class=\"syntax3\">2005<\/span><br \/><span class=\"gutterH\">  15:<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*\/<\/span><br \/><span class=\"gutter\">  16:<\/span><span class=\"syntax8\">public<\/span> <span class=\"syntax10\">class<\/span> Task <span class=\"syntax8\">implements<\/span> Runnable <span class=\"syntax18\">{<\/span><br \/><span class=\"gutter\">  17:<\/span>        <span class=\"syntax8\">private<\/span> Socket socket;<br \/><span class=\"gutter\">  18:<\/span>        <span class=\"syntax8\">private<\/span> Server server;<br \/><span class=\"gutter\">  19:<\/span><br \/><span class=\"gutterH\">  20:<\/span>        <span class=\"syntax3\">\/**<\/span><br \/><span class=\"gutter\">  21:<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">Class<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">constructor<\/span><br \/><span class=\"gutter\">  22:<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax12\">@param<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">socket<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">Client<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">Socket<\/span><br \/><span class=\"gutter\">  23:<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax12\">@since<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">0<\/span><span class=\"syntax3\">.<\/span><span class=\"syntax3\">1<\/span><br \/><span class=\"gutter\">  24:<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*\/<\/span><br \/><span class=\"gutterH\">  25:<\/span>        <span class=\"syntax8\">public<\/span> <span class=\"syntax6\">Task<\/span>(Socket socket, Server server) <span class=\"syntax18\">{<\/span><br \/><span class=\"gutter\">  26:<\/span>                <span class=\"syntax14\">this<\/span>.socket <span class=\"syntax18\">=<\/span> socket;<br \/><span class=\"gutter\">  27:<\/span>                <span class=\"syntax14\">this<\/span>.server <span class=\"syntax18\">=<\/span> server;<br \/><span class=\"gutter\">  28:<\/span>        <span class=\"syntax18\">}<\/span><br \/><span class=\"gutter\">  29:<\/span><br \/><span class=\"gutterH\">  30:<\/span>    <br \/><span class=\"gutter\">  31:<\/span>        <span class=\"syntax3\">\/**<\/span><br \/><span class=\"gutter\">  32:<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">Method<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">called<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">by<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">the<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">current<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">executing<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">thread<\/span><br \/><span class=\"gutter\">  33:<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax12\">@since<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">0<\/span><span class=\"syntax3\">.<\/span><span class=\"syntax3\">1<\/span><br \/><span class=\"gutter\">  34:<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*\/<\/span><br \/><span class=\"gutterH\">  35:<\/span>        <span class=\"syntax8\">public<\/span> <span class=\"syntax10\">void<\/span> <span class=\"syntax6\">run<\/span>() <span class=\"syntax18\">{<\/span><br \/><span class=\"gutter\">  36:<\/span>                PrintWriter out <span class=\"syntax18\">=<\/span> <span class=\"syntax14\">null<\/span>;<br \/><span class=\"gutter\">  37:<\/span>                BufferedReader  in  <span class=\"syntax18\">=<\/span> <span class=\"syntax14\">null<\/span>;<br \/><span class=\"gutter\">  38:<\/span>                <span class=\"syntax8\">try<\/span> <span class=\"syntax18\">{<\/span><br \/><span class=\"gutter\">  39:<\/span>                        out <span class=\"syntax18\">=<\/span> <span class=\"syntax8\">new<\/span> <span class=\"syntax6\">PrintWriter<\/span>(<br \/><span class=\"gutterH\">  40:<\/span>                                socket.<span class=\"syntax6\">getOutputStream<\/span>(),<br \/><span class=\"gutter\">  41:<\/span>                                <span class=\"syntax14\">true<\/span><br \/><span class=\"gutter\">  42:<\/span>                                );<br \/><span class=\"gutter\">  43:<\/span>                        in  <span class=\"syntax18\">=<\/span> <span class=\"syntax8\">new<\/span> <span class=\"syntax6\">BufferedReader<\/span>(<br \/><span class=\"gutter\">  44:<\/span>                                <span class=\"syntax8\">new<\/span> <span class=\"syntax6\">InputStreamReader<\/span>(<br \/><span class=\"gutterH\">  45:<\/span>                                        socket.<span class=\"syntax6\">getInputStream<\/span>()<br \/><span class=\"gutter\">  46:<\/span>                                        )<br \/><span class=\"gutter\">  47:<\/span>                                );<br \/><span class=\"gutter\">  48:<\/span>                        String line <span class=\"syntax18\">=<\/span> <span class=\"syntax14\">null<\/span>;<br \/><span class=\"gutter\">  49:<\/span>                        <span class=\"syntax8\">while<\/span>( (line <span class=\"syntax18\">=<\/span> in.<span class=\"syntax6\">readLine<\/span>()) <span class=\"syntax18\">!<\/span><span class=\"syntax18\">=<\/span> <span class=\"syntax14\">null<\/span> ) <span class=\"syntax18\">{<\/span><br \/><span class=\"gutterH\">  50:<\/span>                                <span class=\"syntax1\">\/*<\/span><br \/><span class=\"gutter\">  51:<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">*<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">Now<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">take<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">the<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">input<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">and<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">write<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">it<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">back<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">to<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">the<\/span><br \/><span class=\"gutter\">  52:<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">*<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">client.<\/span><br \/><span class=\"gutter\">  53:<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">*\/<\/span><br \/><span class=\"gutter\">  54:<\/span>                                out.<span class=\"syntax6\">write<\/span>(line);<br \/><span class=\"gutterH\">  55:<\/span>                                out.<span class=\"syntax6\">write<\/span>(<span class=\"syntax13\">\"<\/span><span class=\"syntax13\">\\n<\/span><span class=\"syntax13\">\"<\/span>);<br \/><span class=\"gutter\">  56:<\/span>                                <span class=\"syntax8\">if<\/span> (line.<span class=\"syntax6\">equals<\/span>(<span class=\"syntax13\">\"<\/span><span class=\"syntax13\">.<\/span><span class=\"syntax13\">\"<\/span>)) <span class=\"syntax18\">{<\/span><br \/><span class=\"gutter\">  57:<\/span>                                        <span class=\"syntax8\">break<\/span>;<br \/><span class=\"gutter\">  58:<\/span>                                <span class=\"syntax18\">}<\/span><br \/><span class=\"gutter\">  59:<\/span>                        <span class=\"syntax18\">}<\/span><br \/><span class=\"gutterH\">  60:<\/span>                        line <span class=\"syntax18\">=<\/span> <span class=\"syntax14\">null<\/span>;<br \/><span class=\"gutter\">  61:<\/span>                <span class=\"syntax18\">}<\/span> <span class=\"syntax8\">catch<\/span> (IOException ioexp) <span class=\"syntax18\">{<\/span><br \/><span class=\"gutter\">  62:<\/span>                        ioexp.<span class=\"syntax6\">printStackTrace<\/span>();<br \/><span class=\"gutter\">  63:<\/span>                <span class=\"syntax18\">}<\/span> <span class=\"syntax8\">finally<\/span> <span class=\"syntax18\">{<\/span><br \/><span class=\"gutter\">  64:<\/span>                        <span class=\"syntax8\">if<\/span> (out <span class=\"syntax18\">!<\/span><span class=\"syntax18\">=<\/span> <span class=\"syntax14\">null<\/span>) <span class=\"syntax18\">{<\/span><br \/><span class=\"gutterH\">  65:<\/span>                                <span class=\"syntax8\">try<\/span> <span class=\"syntax18\">{<\/span><br \/><span class=\"gutter\">  66:<\/span>                                        out.<span class=\"syntax6\">close<\/span>();<br \/><span class=\"gutter\">  67:<\/span>                                <span class=\"syntax18\">}<\/span> <span class=\"syntax8\">catch<\/span> (IOException ignore) <span class=\"syntax18\">{<\/span><br \/><span class=\"gutter\">  68:<\/span>                                        <span class=\"syntax2\">\/\/<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">Empty<\/span><br \/><span class=\"gutter\">  69:<\/span>                                <span class=\"syntax18\">}<\/span>;<br \/><span class=\"gutterH\">  70:<\/span>                        <span class=\"syntax18\">}<\/span><br \/><span class=\"gutter\">  71:<\/span>                        <span class=\"syntax8\">if<\/span> (in <span class=\"syntax18\">!<\/span><span class=\"syntax18\">=<\/span> <span class=\"syntax14\">null<\/span>) <span class=\"syntax18\">{<\/span><br \/><span class=\"gutter\">  72:<\/span>                                <span class=\"syntax8\">try<\/span> <span class=\"syntax18\">{<\/span><br \/><span class=\"gutter\">  73:<\/span>                                        in.<span class=\"syntax6\">close<\/span>();<br \/><span class=\"gutter\">  74:<\/span>                                <span class=\"syntax18\">}<\/span> <span class=\"syntax8\">catch<\/span> (IOException ignore) <span class=\"syntax18\">{<\/span><br \/><span class=\"gutterH\">  75:<\/span>                                        <span class=\"syntax2\">\/\/<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">Empty<\/span><br \/><span class=\"gutter\">  76:<\/span>                                <span class=\"syntax18\">}<\/span>;<br \/><span class=\"gutter\">  77:<\/span>                        <span class=\"syntax18\">}<\/span><br \/><span class=\"gutter\">  78:<\/span>                        <span class=\"syntax8\">if<\/span> (socket <span class=\"syntax18\">!<\/span><span class=\"syntax18\">=<\/span> <span class=\"syntax14\">null<\/span>) <span class=\"syntax18\">{<\/span><br \/><span class=\"gutter\">  79:<\/span>                                <span class=\"syntax8\">try<\/span> <span class=\"syntax18\">{<\/span><br \/><span class=\"gutterH\">  80:<\/span>                                        socket.<span class=\"syntax6\">close<\/span>();<br \/><span class=\"gutter\">  81:<\/span>                                <span class=\"syntax18\">}<\/span> <span class=\"syntax8\">catch<\/span> (IOException ignore) <span class=\"syntax18\">{<\/span><br \/><span class=\"gutter\">  82:<\/span>                                        <span class=\"syntax2\">\/\/<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">Empty<\/span><br \/><span class=\"gutter\">  83:<\/span>                                <span class=\"syntax18\">}<\/span>;<br \/><span class=\"gutter\">  84:<\/span>                        <span class=\"syntax18\">}<\/span><br \/><span class=\"gutterH\">  85:<\/span>                        server.<span class=\"syntax6\">decrementClient<\/span>();<br \/><span class=\"gutter\">  86:<\/span>                <span class=\"syntax18\">}<\/span><br \/><span class=\"gutter\">  87:<\/span>            <br \/><span class=\"gutter\">  88:<\/span>        <span class=\"syntax18\">}<\/span><br \/><span class=\"gutter\">  89:<\/span><span class=\"syntax18\">}<\/span><br \/><\/pre>\n<p>Y el servidor el cual escucha por nuevas conexiones y despacha nuevas tareas:<\/p>\n<style type=\"text\/css\"><!-- .syntax0 { color: #000000; } .syntax1 { color: #cc0000; } .syntax2 { color: #ff8400; } .syntax3 { color: #6600cc; } .syntax4 { color: #cc6600; } .syntax5 { color: #ff0000; } .syntax6 { color: #9966ff; } .syntax7 { background: #ffffcc; color: #ff0066; } .syntax8 { color: #006699; font-weight: bold; } .syntax9 { color: #009966; font-weight: bold; } .syntax10 { color: #0099ff; font-weight: bold; } .syntax11 { color: #66ccff; font-weight: bold; } .syntax12 { color: #02b902; } .syntax13 { color: #ff00cc; } .syntax14 { color: #cc00cc; } .syntax15 { color: #9900cc; } .syntax16 { color: #6600cc; } .syntax17 { color: #0000ff; } .syntax18 { color: #000000; font-weight: bold; } .gutter { background: #dbdbdb; color: #000000; } .gutterH { background: #dbdbdb; color: #666699; } --><br \/><\/style>\n<p><\/p>\n<pre><span class=\"gutter\">   1:<\/span><span class=\"syntax9\">import<\/span> java.io.IOException;<br \/><span class=\"gutter\">   2:<\/span><span class=\"syntax9\">import<\/span> java.net.ServerSocket;<br \/><span class=\"gutter\">   3:<\/span><span class=\"syntax9\">import<\/span> java.net.Socket;<br \/><span class=\"gutter\">   4:<\/span><span class=\"syntax3\">\/**<\/span><br \/><span class=\"gutterH\">   5:<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">This<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">class<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">shows<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">how<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">to<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">create<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">a<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">simple<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">Echo<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">server<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">with<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">TCP<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">Sockets<\/span><span class=\"syntax3\">.<\/span><br \/><span class=\"gutter\">   6:<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">License<\/span><span class=\"syntax3\">:<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">GPL<\/span><br \/><span class=\"gutter\">   7:<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">Blog<\/span><span class=\"syntax3\">:<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">El<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">Angel<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">Negro<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">-<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">http<\/span><span class=\"syntax3\">:<\/span><span class=\"syntax3\">\/<\/span><span class=\"syntax3\">\/<\/span><span class=\"syntax3\">elangelnegro<\/span><span class=\"syntax3\">.<\/span><span class=\"syntax3\">blogspot<\/span><span class=\"syntax3\">.<\/span><span class=\"syntax3\">com<\/span><br \/><span class=\"gutter\">   8:<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax12\">@author<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">Jose<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">V<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">Nunez<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">Z<\/span><br \/><span class=\"gutter\">   9:<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax12\">@version<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">0<\/span><span class=\"syntax3\">.<\/span><span class=\"syntax3\">1<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">-<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">02<\/span><span class=\"syntax3\">\/<\/span><span class=\"syntax3\">28<\/span><span class=\"syntax3\">\/<\/span><span class=\"syntax3\">2005<\/span><br \/><span class=\"gutterH\">  10:<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*\/<\/span><br \/><span class=\"gutter\">  11:<\/span><span class=\"syntax8\">public<\/span> <span class=\"syntax10\">class<\/span> Server <span class=\"syntax18\">{<\/span><br \/><span class=\"gutter\">  12:<\/span>    <br \/><span class=\"gutter\">  13:<\/span>        <span class=\"syntax8\">private<\/span> <span class=\"syntax10\">int<\/span> clients <span class=\"syntax18\">=<\/span> <span class=\"syntax5\">0<\/span>;<br \/><span class=\"gutter\">  14:<\/span>    <br \/><span class=\"gutterH\">  15:<\/span>        <span class=\"syntax3\">\/**<\/span><br \/><span class=\"gutter\">  16:<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">Default<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">port<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">to<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">be<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">used<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">by<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">the<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">server<\/span><br \/><span class=\"gutter\">  17:<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*\/<\/span><br \/><span class=\"gutter\">  18:<\/span>        <span class=\"syntax8\">public<\/span> <span class=\"syntax8\">static<\/span> <span class=\"syntax8\">final<\/span> <span class=\"syntax10\">int<\/span> PORT <span class=\"syntax18\">=<\/span> <span class=\"syntax5\">1973<\/span>;<br \/><span class=\"gutter\">  19:<\/span>    <br \/><span class=\"gutterH\">  20:<\/span>        <span class=\"syntax8\">protected<\/span> <span class=\"syntax8\">synchronized<\/span> <span class=\"syntax10\">void<\/span> <span class=\"syntax6\">incrementClient<\/span>() <span class=\"syntax18\">{<\/span><br \/><span class=\"gutter\">  21:<\/span>                clients<span class=\"syntax18\">+<\/span><span class=\"syntax18\">+<\/span>;<br \/><span class=\"gutter\">  22:<\/span>        <span class=\"syntax18\">}<\/span><br \/><span class=\"gutter\">  23:<\/span>    <br \/><span class=\"gutter\">  24:<\/span>        <span class=\"syntax8\">protected<\/span> <span class=\"syntax8\">synchronized<\/span> <span class=\"syntax10\">void<\/span> <span class=\"syntax6\">decrementClient<\/span>() <span class=\"syntax18\">{<\/span><br \/><span class=\"gutterH\">  25:<\/span>                clients<span class=\"syntax18\">-<\/span><span class=\"syntax18\">-<\/span>;<br \/><span class=\"gutter\">  26:<\/span>        <span class=\"syntax18\">}<\/span><br \/><span class=\"gutter\">  27:<\/span>    <br \/><span class=\"gutter\">  28:<\/span>        <span class=\"syntax3\">\/**<\/span><br \/><span class=\"gutter\">  29:<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">Command<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">line<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">processing<\/span><br \/><span class=\"gutterH\">  30:<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax12\">@param<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">args<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">-<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">ignored<\/span><br \/><span class=\"gutter\">  31:<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax12\">@throws<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">IOException<\/span><br \/><span class=\"gutter\">  32:<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax12\">@since<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">0<\/span><span class=\"syntax3\">.<\/span><span class=\"syntax3\">1<\/span><br \/><span class=\"gutter\">  33:<\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\"> <\/span><span class=\"syntax3\">*\/<\/span><br \/><span class=\"gutter\">  34:<\/span>        <span class=\"syntax8\">public<\/span> <span class=\"syntax8\">static<\/span> <span class=\"syntax10\">void<\/span> <span class=\"syntax6\">main<\/span>(String [] args) <span class=\"syntax8\">throws<\/span> IOException <span class=\"syntax18\">{<\/span><br \/><span class=\"gutterH\">  35:<\/span>                ServerSocket server <span class=\"syntax18\">=<\/span> <span class=\"syntax14\">null<\/span>;<br \/><span class=\"gutter\">  36:<\/span>                <span class=\"syntax8\">try<\/span> <span class=\"syntax18\">{<\/span><br \/><span class=\"gutter\">  37:<\/span>                        server <span class=\"syntax18\">=<\/span> <span class=\"syntax8\">new<\/span> <span class=\"syntax6\">ServerSocket<\/span>(PORT);<br \/><span class=\"gutter\">  38:<\/span>                        System.out.<span class=\"syntax6\">println<\/span>(<span class=\"syntax13\">\"<\/span><span class=\"syntax13\">Started<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">echo<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">server<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">on<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">port:<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">\"<\/span><br \/><span class=\"gutter\">  39:<\/span>                                <span class=\"syntax18\">+<\/span> PORT);<br \/><span class=\"gutterH\">  40:<\/span>                        Server instance <span class=\"syntax18\">=<\/span> <span class=\"syntax8\">new<\/span> <span class=\"syntax6\">Server<\/span>();<br \/><span class=\"gutter\">  41:<\/span>                        <span class=\"syntax8\">while<\/span>(<span class=\"syntax14\">true<\/span>) <span class=\"syntax18\">{<\/span><br \/><span class=\"gutter\">  42:<\/span>                                Socket socket <span class=\"syntax18\">=<\/span> server.<span class=\"syntax6\">accept<\/span>();<br \/><span class=\"gutter\">  43:<\/span>                                instance.<span class=\"syntax6\">incrementClient<\/span>();<br \/><span class=\"gutter\">  44:<\/span>                                System.out.<span class=\"syntax6\">println<\/span>(<span class=\"syntax13\">\"<\/span><span class=\"syntax13\">Connected<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">client<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">#:<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">\"<\/span><br \/><span class=\"gutterH\">  45:<\/span>                                        <span class=\"syntax18\">+<\/span> instance.clients);<br \/><span class=\"gutter\">  46:<\/span>                                Task task <span class=\"syntax18\">=<\/span> <span class=\"syntax8\">new<\/span> <span class=\"syntax6\">Task<\/span>(socket, instance);<br \/><span class=\"gutter\">  47:<\/span>                                Thread thread <span class=\"syntax18\">=<\/span> <span class=\"syntax8\">new<\/span> <span class=\"syntax6\">Thread<\/span>(task);<br \/><span class=\"gutter\">  48:<\/span>                                thread.<span class=\"syntax6\">start<\/span>();<br \/><span class=\"gutter\">  49:<\/span>                        <span class=\"syntax18\">}<\/span><br \/><span class=\"gutterH\">  50:<\/span>                <span class=\"syntax18\">}<\/span> <span class=\"syntax8\">catch<\/span> (IOException ioexp) <span class=\"syntax18\">{<\/span><br \/><span class=\"gutter\">  51:<\/span>                        <span class=\"syntax8\">throw<\/span> ioexp;<br \/><span class=\"gutter\">  52:<\/span>                <span class=\"syntax18\">}<\/span> <span class=\"syntax8\">finally<\/span> <span class=\"syntax18\">{<\/span><br \/><span class=\"gutter\">  53:<\/span>                        <span class=\"syntax8\">try<\/span> <span class=\"syntax18\">{<\/span><br \/><span class=\"gutter\">  54:<\/span>                                <span class=\"syntax8\">if<\/span> (server <span class=\"syntax18\">!<\/span><span class=\"syntax18\">=<\/span> <span class=\"syntax14\">null<\/span>) <span class=\"syntax18\">{<\/span><br \/><span class=\"gutterH\">  55:<\/span>                                        server.<span class=\"syntax6\">close<\/span>();<br \/><span class=\"gutter\">  56:<\/span>                                <span class=\"syntax18\">}<\/span><br \/><span class=\"gutter\">  57:<\/span>                        <span class=\"syntax18\">}<\/span> <span class=\"syntax8\">catch<\/span> (IOException ignore) <span class=\"syntax18\">{<\/span><br \/><span class=\"gutter\">  58:<\/span>                                <span class=\"syntax2\">\/\/<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">Empty<\/span><br \/><span class=\"gutter\">  59:<\/span>                        <span class=\"syntax18\">}<\/span><br \/><span class=\"gutterH\">  60:<\/span>                <span class=\"syntax18\">}<\/span><br \/><span class=\"gutter\">  61:<\/span>        <span class=\"syntax18\">}<\/span><br \/><span class=\"gutter\">  62:<\/span><span class=\"syntax18\">}<\/span><br \/><\/pre>\n<p><a href=\"http:\/\/prdownloads.sourceforge.net\/elangelnegro\/echo-server.tar.gz?download\">Aqu\u00ed<\/a> est\u00e1 el enlace para que se lo baje.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Esta es una t\u00edpica pregunta de entrevista de programaci\u00f3n: Escriba un servidor sencillo en Java, el cual est\u00e9 en capacidad de atender a varios clientes a la vez. El truco aqui es abstraer la definici\u00f3n de una tarea; El servidor recibe la nueva conexi\u00f3n (un Socket) y es all\u00ed en donde deber\u00edamos crear una nueva <a class=\"read-more\" href=\"http:\/\/kodegeek.com\/blog\/2005\/03\/08\/echando-codigo-escribir-un-servidor-sencillo-en-java\/\">[&hellip;]<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[],"tags":[],"_links":{"self":[{"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/posts\/590"}],"collection":[{"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/comments?post=590"}],"version-history":[{"count":0,"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/posts\/590\/revisions"}],"wp:attachment":[{"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/media?parent=590"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/categories?post=590"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/tags?post=590"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}