Java fornece duas classes para o protocolo TCP, que são usadas na programação do lado do cliente e na programação do lado do servidor, respectivamente. Antes de a aplicação iniciar a comunicação, primeiro é necessário criar uma conexão, iniciada pelo programa cliente, e o programa do lado do servidor precisa sempre escutar o número da porta específica do host, aguardando a conexão do cliente; No cliente, precisamos apenas usar instâncias de Socket, enquanto o servidor precisa lidar com instâncias ServerSocket e instâncias de Socket, ambas usam OutputStream e InpuStream para enviar e receber dados;
A melhor forma de aprender um conhecimento é utilizá-lo. Através das notas anteriores, já sabemos como obter as informações de endereço do host. Agora utilizamos um programa simples para aprender inicialmente a programação de Socket utilizando o protocolo TCP no transporte. camada.
Lado do servidor TCP
Na programação Socket, o lado do servidor é muito mais complicado que o lado do cliente. A tarefa do servidor é estabelecer um terminal de comunicação e aguardar passivamente a conexão do cliente. O exemplo a seguir de um programa do lado do servidor é usado para ouvir o número da porta obtido na entrada do console e enviar de volta a mensagem enviada pelo cliente.
Copie o código do código da seguinte forma:
importjava.net.*;
importjava.text.MessageFormat;
importjava.io.*;
publicclassTCPEchoServer{
privatestaticfinalintBUFSIZE=32;
publicstaticvoidmain(String[]args)throwsIOException{
//TODOMetodo gerado automaticamentestub
//Obtém o número da porta a ser monitorada no console
if(args.comprimento!=1)
thrownewIllegalArgumentException("Parâmetro(s):<Porta>");
//Obtém o número da porta
intservPort=Integer.parseInt(args[0]);
//Instancia uma instância do objeto ServerSocket
ServerSocketservSocket=newServerSocket(servPort);
System.out.println(MessageFormat.format("Iniciar escuta, número da porta: {0}",args[0]));
//Número total de bytes dos dados iniciais recebidos
intrecvMsgSize;
//buffer para receber dados
byte[]receberBuf=newbyte[BUFSIZE];
//Iteração de loop, escuta o número da porta e processa novas solicitações de conexão
enquanto(verdadeiro){
//Bloqueie e espere, crie uma nova instância de conexão toda vez que uma solicitação for recebida
SocketclntSocket=servSocket.accept();
//Obtém o SocketAddress do cliente conectado
SocketAddressclientAddress=clntSocket.getRemoteSocketAddress();
//Imprime as informações do endereço do cliente de conexão
System.out.println("Handlingclientat"+clientAddress);
//Objeto que recebe dados do cliente
InputStreamin=clntSocket.getInputStream();
//Objeto que envia dados para o cliente
OutputStreamout=clntSocket.getOutputStream();
//Após ler os dados enviados pelo cliente, envie para o cliente
while((recvMsgSize=in.read(receiveBuf))!=-1){
out.write(receiveBuf,0,recvMsgSize);
}
//Quando o cliente fechar a conexão, feche a conexão
System.out.println("Cliente fecha conexão");
clntSocket.close();
}
}
}
Cliente TCP
Na programação Socket, primeiro o cliente precisa enviar para o servidor e depois esperar passivamente pela resposta do servidor. No exemplo a seguir: enviamos informações para o servidor, aguardamos a mensagem enviada pelo servidor e imprimimos.
Copie o código do código da seguinte forma:
importjava.io.*;
importjava.net.Socket;
importjava.net.SocketException;
publicclassTCPEchoClient{
publicstaticvoidmain(String[]args)throwsIOException{
//TODOMetodo gerado automaticamentestub
//Determina se os parâmetros recebidos do console estão corretos
if((args.comprimento<2)||(args.comprimento>3))
thrownewIllegalArgumentException(
"Parâmetro(s):<Servidor><Word>[<Porta>]]");
//Obtém o endereço do servidor
Stringserver=args[0];
//Obtém as informações que precisam ser enviadas
byte[]data=args[1].getBytes();
//Se houver três parâmetros escravos, obtenha o número da porta para enviar informações. O número da porta padrão é 8099.
intservPort=(args.length==3)?Integer.parseInt(args[2]):8099;
//Instancia uma instância de Socket com base no endereço do servidor e no número da porta
Socketsocket=newSocket(servidor,servPort);
System.out.println("Conectado ao servidor... enviando echostring");
//Retorna o fluxo de entrada deste soquete, que é o objeto de dados recebido do servidor
InputStreamin=socket.getInputStream();
//Retorna o fluxo de saída deste soquete, que é o objeto de dados enviado ao servidor
OutputStreamout=socket.getOutputStream();
//Envia os dados recebidos do console para o servidor
out.write(dados);
//O contador que recebe os dados irá escrever o deslocamento inicial dos dados
inttotalBytesRcvd=0;
//Inicializa o número total de bytes de dados recebidos
intbytesRcvd;
while(totalBytesRcvd<data.length){
//Se o servidor fechar a conexão, ele retorna -1. O método read retorna o número total de bytes de dados recebidos.
if((bytesRcvd=in.read(dados,totalBytesRcvd,dados.comprimento
-totalBytesRcvd))==-1)
thrownewSocketException("A conexão com o servidor foi encerrada");
totalBytesRcvd+=bytesRcvd;
}
//Imprime os dados enviados pelo servidor
System.out.println("Recebido:"+newString(dados));
//Fecha a conexão
soquete.close();
}
}
Primeiro execute o servidor e escute na porta 8099:
Em seguida, execute o programa cliente e envie uma mensagem ao servidor:
Olhando novamente para nosso console do lado do servidor, podemos ver as informações de endereço da conexão anterior do cliente: