Para aplicativos em tempo real ou jogos em tempo real, o protocolo HTTP geralmente não pode atender às nossas necessidades. O soquete é muito prático para nós. Abaixo estão as notas para este estudo. Ele explica principalmente os aspectos do tipo de exceção, princípio de interação, soquete, servidorsocket e multithreading.
Tipo de exceção
Antes de entender o conteúdo do soquete, você precisa entender alguns tipos de exceção envolvidos. Os quatro tipos a seguir são herdados da IoException, muitas vezes aparecem diretamente depois.
UnkowNosTexception: nome do host ou erro IP
ConnectException: O servidor se recusa a se conectar, o servidor não começa (o número de filas excede, a conexão é rejeitada)
SockettimeoutException: tempo limite da conexão
BindException: o objeto de soquete não pode estar ligado ao endereço IP local formulado ou porta
Processo de interação
Eu acho que a imagem a seguir foi explicada em detalhes e claramente.
Soquete
Construtor
Socket()Socket(InetAddress address, int port)throws UnknownHostException, IOExceptionSocket(InetAddress address, int port, InetAddress localAddress, int localPort)throws IOExceptionSocket(String host, int port)throws UnknownHostException, IOExceptionSocket(String host, int port, InetAddress localAddress, int localPort)throws IOException
Exceto pelo primeiro sem parâmetros, outros construtores tentarão estabelecer uma conexão com o servidor. Se falhar, um erro de IoException será lançado. Se for bem -sucedido, o objeto de soquete é retornado.
O INETADDRESS é uma aula usada para gravar o host. Seu gethostbyname estático (string msg) pode retornar uma instância, e seu método estático getLocAlHost () também pode obter o endereço IP do host atual e retornar uma instância. Os parâmetros do soquete (host da String, INT Port, InetAddress LocalAddress, Int Localport) Construtor são o IP de destino, a porta de destino, o IP local e a porta local.
Método de soquete
getineTAddress (); Endereço IP do servidor remoto
getport (); Porta de servidor remoto
getLocalAddress () endereço IP do cliente local
getLocalport () porta do cliente local
getInputStream (); getInputStream ();
getoutStream (); Obtenha fluxo de saída
Vale ressaltar que, entre esses métodos, os mais importantes são GetInputStream () e GetOutputStream ().
Status do soquete
isClosed (); // A conexão está fechada? Se fechado, retorne verdadeiro; Caso contrário, retorne FALSE
isConnect (); // retorna true se conectado; Caso contrário, retorne FALSE
isbound (); // Se o soquete estiver vinculado a uma porta local, retorne true; Caso contrário, retorne FALSE
Se você deseja confirmar se o status do soquete está em conexão, a seguinte declaração é uma boa maneira de julgar.
boolean isConnection = Socket.isconnected () &&! Socket.isclosed (); // julga se está atualmente em conexão
Soquete semi-fechado
Muitas vezes, não sabemos quanto tempo leva para terminar no fluxo de entrada obtido. Aqui estão alguns métodos comuns:
ServerSocket
Construtor
Serversocket () lança IoExceptionserversocket (porta int) lança ioexceptionserversocket (porta int, int backlog) lança ioexceptionserversock
Observação:
1. A porta a ser ouvida pelo servidor de porta; o comprimento da fila da solicitação de conexão com o cliente de backlog; O servidor bindaddr liga o IP
2. Se a porta estiver ocupada ou não tiver permissão para usar determinadas portas, um erro de BindException será lançado. Por exemplo, as portas de 1 a 1023 exigem que um administrador tenha vinculação de permissão.
3. Se a porta estiver definida como 0, o sistema atribuirá automaticamente uma porta a ela;
4. O bindaddr é usado para vincular o IP do servidor. Por que existe tal configuração? Por exemplo, algumas máquinas têm vários cartões de rede.
5. Depois que o ServerSocket está vinculado à porta de escuta, ele não pode ser alterado. Serversocket () pode definir outros parâmetros antes de vincular a porta.
Exemplo de servidor de thread único
public void Service () {while (true) {soquete soquete = null; tente {socket = serversocket.accept (); // pegue uma conexão da fila de conexão, se não, aguarde o system.out.println ("endereço:"+soket.getineTAddress ()+":"+socket.getport ()); ... // Receba e envie dados} catch (ioexception e) {e.printStackTrace ();} finalmente {tente {if (socket! = Null) soket.close (); // Após a comunicação com um cliente, feche o soquete} catch (ioexception e) {e.printstacktrace ();}}}}Servidores multithreadsocket
Escusado será dizer que os benefícios da multi-threading são multi-threading e a maioria dos cenários é multi-threading. Seja nossos jogos em tempo real ou IM, as necessidades de multi-threading são necessárias. Vamos falar sobre o método de implementação abaixo:
Métodos que implementam multi-threading herdam a classe Thread ou implementam a interface executável. Obviamente, os pools de threads também podem ser usados, mas a essência da implementação é semelhante.
Aqui está um exemplo:
O código a seguir é o encadeamento principal do servidor. Atribua um tópico de trabalhador a cada cliente:
public void Service () {while (true) {soquete soquete = null; tente {socket = serversocket.accept (); // O thread principal recebe o encadeamento de conexão do cliente workthread = new Thread (novo manipulador (soquete)); // crie thread workthread.start (); // start thread} catch (Exceção e) {e.printStackTrace (); }}}Obviamente, o foco aqui é como implementar a classe Handler. Handler precisa implementar a interface executável:
Classe Handler implementa Runnable {Setorgrafia privada; manipulador público (soquete) {this.socket = soket; } public void run () {try {System.out.println ("new Connection:"+Socket.getineTAddress ()+":"+Socket.getport ()); Thread.sleep (10000); } catch (Exceção e) {e.printStackTrace ();} finalmente {try {System.out.println ("Feche a conexão:"+soket.getineTAddress ()+":"+soket.getport ()); if (soquete! = NULL) soquete.close (); } catch (ioexception e) {e.printStackTrace (); }}}} Obviamente, existem outras maneiras de multi-thread primeiro, como pools de threads ou pools de threads que são incorporados à JVM. Não vou explicar aqui.
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.