Para aplicaciones en tiempo real o juegos en tiempo real, el protocolo HTTP a menudo no puede satisfacer nuestras necesidades. El socket es muy práctico para nosotros. A continuación hay notas para este estudio. Explica principalmente los aspectos del tipo de excepción, el principio de interacción, el enchufe, el servidor y multiproceso.
Tipo de excepción
Antes de comprender el contenido de Socket, debe comprender algunos tipos de excepción involucrados. Los siguientes cuatro tipos son todos heredados de IOException, por lo que muchas ioexception aparecen directamente después.
UnkownHostException: nombre de host o error de IP
ConnectException: el servidor se niega a conectarse, el servidor no se inicia (el número de colas excede, la conexión se rechaza)
SocketTimeOutException: Tiempo de espera de conexión
BindException: el objeto de socket no puede estar unido a la dirección IP local formulada o el puerto
Proceso de interacción
Creo que la siguiente imagen se ha explicado en detalle y claramente.
Enchufe
Constructor
Socket () socket (la dirección inetaddress, int puerto) lanza desconocidoHostException, ioexceptionsocket (ineTaddress dirección, int Port, inetaddress localaddress, int localport) lanza ioexceptionsocket (string host, int port) tira desconocido, IooExcEptiptionsocket (string host, int port, inteetdress shress, striet, intsoxception).
Excepto por el primero sin parámetros, otros constructores intentarán establecer una conexión con el servidor. Si falla, se lanzará un error de IOException. Si tiene éxito, se devuelve el objeto Socket.
InetAddress es una clase utilizada para grabar el host. Su gethostByName estático (MSG de cadena) puede devolver una instancia, y su método estático getLocalHost () también puede obtener la dirección IP del host actual y devolver una instancia. Los parámetros del constructor Socket (String Host, Int Port, InetAddress Localaddress, Int Localport) son la IP de destino, el puerto de destino, la IP local y el puerto local.
Método de socket
getInetAddress (); Dirección IP del servidor remoto
getPort (); puerto de servidor remoto
getLocalAddress () dirección IP del cliente local
getLocalport () puerto del cliente local
getInputStream (); getInputStream ();
getOutStream (); Obtener flujo de salida
Vale la pena señalar que entre estos métodos, los más importantes son GetInputStream () y GetOutputStream ().
Estado de socket
isClosed (); // ¿La conexión está cerrada? Si está cerrado, regrese verdadero; De lo contrario, devuelve falso
ISconnect (); // devolver verdadero si está conectado; De lo contrario, regrese falso
isbound (); // Si el socket ha estado vinculado a un puerto local, devuelva verdadero; De lo contrario, devuelve falso
Si desea confirmar si el estado del socket está en una conexión, la siguiente declaración es una buena manera de juzgar.
boolean Isconnection = Socket.isconnected () &&! Socket.isClosed (); // juzga si está actualmente en conexión
Enchufe semicerrado
Muchas veces, no sabemos cuánto tiempo lleva terminar en la corriente de entrada obtenida. Aquí hay algunos métodos comunes:
Mínimo
Constructor
Serversocket () lanza IOEXCEPTIONSERVERSOCKET (int Port) lanza IOEXCEPTionServerSocket (int Port, int Backlog) lanza IOEXCEPTionSerVersocket (int Port, int Backlog, inetAddress BindAddr) lanza IOEXCEPTION
Nota:
1. El puerto a ser escuchado por el servidor de puerto; la longitud de la cola de la solicitud de conexión del cliente de Backlog; El servidor BindAddr vincula la IP
2. Si el puerto está ocupado o no tiene permiso para usar ciertos puertos, se lanzará un error de BindException. Por ejemplo, los puertos de 1 a 1023 requieren que un administrador tenga permiso vinculante.
3. Si el puerto está configurado en 0, el sistema asignará automáticamente un puerto;
4. BindAddr se usa para vincular la IP del servidor. ¿Por qué hay tal entorno? Por ejemplo, algunas máquinas tienen múltiples tarjetas de red.
5. Una vez que el SerververSocket está atado al puerto de escucha, no se puede cambiar. Serversocket () puede establecer otros parámetros antes de unir el puerto.
Ejemplo de Servidor de ServerSocket
public void Service () {while (true) {socket socket = null; Pruebe {Socket = Serversocket.accept (); // tome una conexión desde la cola de conexión, si no, espere a System.out.println ("Dirección:"+Socket.GetInetAddress ()+":"+Socket.getPort ()); ... // Recibir y enviar datos} Catch (ioException e) {E.PrintStackTrace ();} Finalmente {try {if (Socket! = NULL) Socket.Close (); // Después de la comunicación con un cliente, Cerrar Socket} Catch (IOException e) {E.PrintStackTrace ();}}}}Servidor de múltiples opciones
No hace falta decir que los beneficios de la múltiples subprocesos son múltiples en el subproceso, y la mayoría de los escenarios son múltiples. Ya sea que se trate de nuestros juegos en tiempo real o IM, las necesidades de múltiples subprocesos son necesarias. Hablemos sobre el método de implementación a continuación:
Métodos que implementan múltiples subprocesos heredar la clase de subprocesos o implementan la interfaz ejecutable. Por supuesto, también se pueden usar grupos de subprocesos, pero la esencia de la implementación es similar.
Aquí hay un ejemplo:
El siguiente código es el hilo principal del servidor. Asigne un hilo de trabajador a cada cliente:
public void Service () {while (true) {socket socket = null; intente {socket = serversocket.accept (); // El hilo principal obtiene el hilo de conexión del cliente WorkThread = nuevo hilo (nuevo controlador (Socket)); // Crear hilo de trabajo thread.start (); // Iniciar hilo} Catch (Exception e) {E.PrintStackTrace (); }}}Por supuesto, el enfoque aquí está en cómo implementar la clase de controlador. El controlador necesita implementar la interfaz ejecutable:
Class Handler implementa Runnable {Socket de socket privado; Handler público (socket Socket) {this.socket = socket; } public void run () {try {system.out.println ("nueva conexión:"+socket.getInetAddress ()+":"+socket.getport ()); Thread.sleep (10000); } Catch (Exception e) {E.PrintStackTrace ();} Finalmente {try {System.out.println ("Cerrar la conexión:"+Socket.getInetAddress ()+":"+Socket.getPort ()); if (Socket! = NULL) Socket.Close (); } catch (ioException e) {E.PrintStackTrace (); }}}} Por supuesto, hay otras formas de hacer múltiples hilos, como piscinas de hilos o piscinas de hilos que están integradas en JVM. No lo explicaré aquí.
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.