2010-10-28 27 views
9

Soy un buen programador, pero no tengo experiencia en redes.Introducción a la red cliente-servidor

Básicamente, me gustaría entrar en la red cliente-servidor. Por ejemplo, me gustaría intentar poner en marcha un proceso de servidor que permita a los clientes conectarse a través de Internet y enviar ping a todos los otros clientes conectados. Entonces tal vez trate de desarrollar un cliente de chat simple, o un simple juego de varios jugadores e iré desde allí.

Idiomas que saben muy bien que podría ser útil: Java, C++, C

¿Cómo puedo empezar? Quiero aprender las mejores prácticas desde el principio, por lo que los buenos recursos de aprendizaje que pueda recomendar (por ejemplo, libros, materiales en línea, etc.) serían geniales.

Editar: ¿Debería también buscar en algún tipo de máquina virtual para emular varias máquinas que interactúan entre sí?

Editar 2: he puesto una recompensa de 50 rep. Algunas respuestas excelentes se han presentado hasta el momento, pero estoy buscando respuestas más detalladas, así que espero que esto fomente eso. Por ejemplo, una respuesta de alguien con experiencia en este tipo de cosas que compara diferentes enfoques de aprendizaje sería realmente útil. ¡Gracias! También podría obtener algunos comentarios sobre todo lo de VM?

+1

Sólo por curiosidad. ¿Cómo se las arregló para "conocer muy bien Java, C y C++" pero nunca involucrarse con las redes? – Cratylus

+0

@ user384706: Aprendiendo la sintaxis de los idiomas, la mayoría de sus bibliotecas y adquiriendo mucha experiencia con ellos. Especifiqué que soy bueno con esos idiomas para comunicar que no necesito tutoriales para principiantes que apunten a enseñar programación Y trabajo en red, o que estén dirigidos a programadores principiantes. Como "Ahora aprenderemos el ciclo while - y luego, pasaremos a usar el ciclo para enviar varias piezas de datos a la vez" :) – Cam

+1

Las VM no son realmente necesarias en mi experiencia ... puedes simular múltiples máquinas simplemente ejecutando múltiples procesos bajo un solo sistema operativo. –

Respuesta

12

Prefiero Java. Voy a explicar TCP:
El concepto básico es que debe ejecutar un "Servidor" en una máquina. Ese servidor acepta clientes que esperan una conexión. Cada conexión pasa por un puerto (ya sabes, espero ...).
Siempre use los puertos por encima de 1024 debido a los puertos inferiores a 1025 son la mayor parte del tiempo reservado para protocolos estándar (como HTTP (80), FTP (21), Telnet, ...)

Sin embargo, la creación de un servidor en Java que se hace de esta manera:

ServerSocket server = new ServerSocket(8888); // 8888 is the port the server will listen on. 

"socket" es la palabra que probablemente está buscando, si usted quiere hacer la investigación.
Y para conectar su cliente a un servidor que tiene que escribir esto:

Socket connectionToTheServer = new Socket("localhost", 8888); // First param: server-address, Second: the port 

Pero ahora, no existe todavía una conexión. El servidor tiene que aceptar al cliente en espera (como noté aquí arriba):

Socket connectionToTheClient = server.accept(); 

¡Hecho! ¡Tu conexión está establecida! La comunicación es como File-IO. Lo único que debe tener en cuenta es que debe decidir cuándo quiere vaciar el búfer y realmente enviar los datos a través del zócalo.
El uso de un PrintStream para el texto-escritura es muy práctico:

OutputStream out = yourSocketHere.getOutputStream(); 
PrintStream ps = new PrintStream(out, true); // Second param: auto-flush on write = true 
ps.println("Hello, Other side of the connection!"); 
// Now, you don't have to flush it, because of the auto-flush flag we turned on. 

Un BufferedReader para el texto, la lectura es la buena (mejor *) Opción:

InputStream in = yourSocketHere.getInputStream(); 
BufferedReader br = new BufferedReader(new InputStreamReader(in)); 
String line = br.readLine(); 
System.out.println(line); // Prints "Hello, Other side of the connection!", in this example (if this would be the other side of the connection. 

Esperamos que usted puede comenzar con la creación de redes con esta ¡información!
PD: Por supuesto, todo el código de red debe ser try-catched para IOExceptions.

EDIT: Olvidé escribir por qué no siempre es la mejor opción. Un BufferedReader utiliza un búfer y lee todo lo que puede en el búfer. Pero a veces no quiere que el BufferedReader robe los bytes después de la nueva línea y los coloque en su propio búfer.
ejemplo corto:

InputStream in = socket.getInputStream(); 
BufferedReader br = new BufferedReader(new InputStreamReader(in)); 
// The other side says hello: 
String text = br.readLine(); 
// For whatever reason, you want to read one single byte from the stream, 
// That single byte, just after the newline: 
byte b = (byte) in.read(); 

Pero el BufferedReader ya tiene ese byte, que desea leer, en su memoria intermedia. Entonces, al llamar al in.read() se devolverá el siguiente byte en el último byte en el búfer del lector.

Por lo tanto, en esta situación, la mejor solución es usar DataInputStream y administrarlo a su manera para saber cuánto tiempo va a ser la cadena y leer solo ese número de bytes y convertirlos en una cadena.O: Se utiliza

DataInputStream.readLine()

Este método no utiliza un búfer y lee byte a byte y comprueba si hay una nueva línea. Entonces este método no roba los bytes del InputStream subyacente.

6

La guía Beej para la Programación en red es absolutamente rotunda. Lo usé en la Universidad.

http://beej.us/guide/bgnet/

Cubre la API de sockets y lo recuerdo usando C++ para los ejemplos de código.

También las redes informáticas de Tannenbaum son una excelente lectura también.

+0

De hecho, tengo un viejo código de cliente y servidor ... ¡Es de mis días de Uni, no el mejor código de todos, pero podría ser útil también! – brumScouse

+0

He echado un vistazo breve a este libro (web), y si bien reconocí el contenido, no creo que sea el mejor orden para que un principiante aprenda sobre las redes de servidores cliente basados ​​en IP. IMNSHO –

+0

Algunos de los otros aspectos solicitados por el OP mencionado pueden ser útiles (algunos programas simples de cliente y servidor, por ejemplo). Sin embargo, tuve el libro mencionado en mi respuesta como un acompañante. – brumScouse

1

No empezar con lo básico, pero entonces debería echar un vistazo a lo que realmente se usa (en Java):

  1. Para uso Apache Mina programación de sockets.
  2. Las aplicaciones de servidor de cliente modernas usan REST: Jersey, RESTeasy (ambos complementos JAX-RS) y Restlet (pionero en este campo).
3

En mi opinión usted debe comenzar por aprender a usar sockets, digamos, en C, UNIX (cualquier tutorial en línea será adecuado, o use "hombre"). Y solo después de eso puede buscar en Google bibliotecas específicas del idioma/sistema operativo y elegir lo que desee o lo que sea que se ajuste mejor a sus necesidades.

LE: Siempre puede probar sus aplicaciones en la misma máquina.

2

Si usted no sabe nada acerca de TCP/IP, me gustaría empezar con el libro impresionante de Douglas E. Comer: Volumen TCP/IP 1.

No es necesario leer todo esto, hay un montón de cosas útiles allí.

Una vez que haya cubierto eso, observe una de las varias implementaciones de redes de código abierto, como boost asio. En mi humilde opinión esta es la biblioteca de redes más fácil de poner en marcha. Una vez que esto haya despertado su interés, comience a investigar algunos de los detalles del socket de nivel inferior. Por cierto, brumScouse ya mencionó la guía de Beej, este es también un muy buen recurso.

Y luego, cuando esté más avanzado, y quiera más: ¡google C10K! ;)

+0

¿Diría que la guía de Beej cae bajo el alcance de 'detalles de socket de nivel inferior'? – Cam

+0

Digamos que esa guía es sobre los apéndices fundamentales; bibliotecas como asio o ACE o lo que sea, simplemente envuelven la funcionalidad expuesta por los sockets api y le dan bonitas abstracciones para trabajar. Entonces, en ese sentido, es un poco "de nivel inferior", pero al mismo tiempo es muy útil tener conocimiento para que sepas cómo funcionan las abstracciones. La razón por la que menciono las abstracciones primero es porque oculta muchos detalles de implementación que podrían perderse en ... – Nim

4

Si está utilizando C++, le recomiendo encarecidamente que consulte el uso de Boost.Asio, es una gran biblioteca de red asincrónica que lo hará llegar a sus objetivos MUCHO más rápido que el uso de sockets directamente.

Obviamente, es una gran idea aprender todo lo relacionado con la red desde cero, pero creo que es muy beneficioso hacerlo con una buena (y fácil de usar) biblioteca que te respalde para que puedas obtener resultados también. .

+0

+1 para una solución C++, recomiendo mirar Boost.Asio –

6
  1. Comprenda los conceptos básicos sobre la conexión en red. Capas, direcciones IP, puertos, paquetes [Específicamente UDP/TCP]

  2. Aprenda abstracciones de programación sobre [1], como Sockets.

  3. Implemente el "Servidor" y el "Cliente" usted mismo.

  4. Pruébelo.

  5. Instale Wireshark en su computadora y busque las direcciones IP, los tipos de paquetes, los números de puerto, etc. que se envían para cada tipo de actividad.

  6. Desarrolle el conocimiento utilizando las API de red de Java/.Net/C++. Probablemente sea una muy mala idea construir todo desde cero.

Java: http://download.oracle.com/javase/tutorial/networking/index.html

.Net: http://msdn.microsoft.com/en-us/library/4as0wz7t.aspx

C++: Programación Unix Red por Richard Stevens

espero que ayude.

2

Vengo de un fondo de programación de red principalmente Linux. He hecho un poco de programación de socket de Windows, por lo que he visto, las API de socket de Windows son bastante similares a las API de socket POSIX, y hay bastante buena información en MSDN para portar desde POSIX a sockets de Windows.

La programación en red no es realmente difícil conceptualmente, hay algunas áreas que necesita conocer para ser efectiva: Primero, debe tener una comprensión básica de la conexión en red. Tendrá que saber al menos sobre TCP e IPv4, ya que es probable que sean los protocolos predeterminados que terminará usando. Comprender un poco sobre DNS y Ethernet a nivel conceptual también será útil, pero no estrictamente necesario al principio. Una vez que tenga una formación básica (leer algunos artículos de wikipedia o una guía básica de redes probablemente sea suficiente para comenzar) puede comenzar a buscar las API de socket POSIX. Estos son bastante sencillos una vez que tienes los principios básicos de red, y hay muchos tutoriales disponibles (la guía de programación de red de Beej fue listada por otra persona, es bastante buena, y las páginas man también tienen algunos ejemplos bastante útiles). El mayor obstáculo con el que se puede encontrar aquí es saber qué necesita en orden de bytes de red frente a orden de bytes de host, pero como regla general todo lo que está escribiendo en un socket debe colocarse primero en el orden de bytes de la red, y cualquier cosa usted lee desde el socket debe convertirse inmediatamente a la orden de bytes del host.

Donde muchas personas tropiezan es que el solo hecho de aprender a usar el API POSIX no es suficiente para hacer una programación efectiva de la red. Te llevará lo suficientemente lejos como para escribir un cliente de eco simple, pero para ir más allá hay otras cosas con las que debes estar familiarizado. Los más grandes están trabajando con descriptores de archivos no bloqueantes, señales, trabajando con select/epoll/etc. Y manejando el flujo de trabajo del proceso secundario. En un nivel alto, es bastante simple desde el punto de vista conceptual (crear-> vincular-> escuchar-> seleccionar-> tenedor-> aceptar), pero si no estás acostumbrado a trabajar con descriptores de archivos, seleccionar, tenedor, etc. entonces esas cosas son Tendrás que ponerte al día.

Uno de los mejores programas para comenzar, en mi opinión, es un cliente de IRC. Te dará todos los elementos básicos que necesitarás (leer/escribir mensajes en un servidor, conexiones concurrentes, tratar con diferentes implementaciones de servidores, etc.), el protocolo es bastante fácil de analizar, y hay muchos servidores fuera. allí para conectarse.

2

Es posible que desee leer

Sockets programming in Java: A tutorial

en JavaWorld. Explica los conceptos básicos. No intente ir demasiado lejos en redes de bajo nivel inicialmente. Codifique algunos clientes/servidores simples para ver cómo funciona.

2

Aquí hay algo que no se ha mencionado aún. Qt

Qt (framework C++) tiene una muy buena clase de "red" que he usado para conexiones de tipo servidor/cliente TCP/UDP. Hay varios ejemplos diferentes que cubren ambos:

conexiones de bloqueo (conexiones que harán que el hilo actual 'espera' para un retorno)

para no bloquear las conexiones (conexiones que hacen sonar call_backs una vez que se dispone de datos)

Check it out y nunca mirar hacia atrás. ¡Están muy bien documentados!

1

Stevens Red UNIX Programación tiene toda la información que pueda desear sobre el uso de la API de sockets BSD (que ahora es la API de sockets estándar) y cómo los diversos sistemas UNIX interpretan las funciones de las API. Incluye una gran cantidad de código que demuestra los temas en discusión. También es muy denso.

La guía de Beej es un buen y rápido resumen de cómo usar la API de sockets. Podría ser uno de los mejores lugares para comenzar y simplemente familiarizarse con la mecánica de armar un servidor y un cliente. Para entender por qué estás haciendo esas llamadas a función con esos datos en ese orden, y qué están haciendo exactamente las llamadas de función, puedes recurrir a Stevens.

Si desea obtener las mejores prácticas, eche un vistazo al código de producción: ¿Cómo maneja la red el Mongrel 2? ¿Qué hay de lighttpd? Varnish? ¿Por qué lo manejan de la manera en que lo hacen?

Usted también puede buscar en la implementación de la pila de red para una plataforma que le interesa. Coge el código fuente del núcleo, posiblemente, un libro de discutir el diseño del núcleo, y cavar en.

1

en mi humilde opinión, la programación del zócalo en Java es mucho más fácil que en C/C++. Puede comenzar a aprenderlo desde el tutorial de Java: http://download.oracle.com/javase/tutorial/networking/sockets/

Para la programación de socket C/C++ "básica", puede aprender de "Beej's Guide to Network Programming".Vale la pena aprender cuando estaba en la universidad :). Luego, puede obtener información sobre Windows Socket API para el próximo punto de inicio.

Para emular el entorno, por supuesto puede usar máquinas virtuales :)