Java proporciona dos clases para el protocolo TCP, que se utilizan en la programación del lado del cliente y en la programación del lado del servidor, respectivamente. Antes de que la aplicación inicie la comunicación, primero se debe crear una conexión, iniciada por el programa del lado del servidor, y el programa del lado del servidor siempre debe escuchar el número de puerto específico del host y esperar la conexión del cliente. En el cliente, solo necesitamos usar instancias de Socket, mientras que el servidor necesita manejar tanto las instancias de ServerSocket como las de Socket; ambas usan OutputStream e InpuStream para enviar y recibir datos.
La mejor manera de aprender un conocimiento es usarlo. A través de las notas anteriores, ya sabemos cómo obtener la información de la dirección del host. Ahora usamos un programa simple para aprender inicialmente a programar Socket usando el protocolo TCP en el transporte. capa.
Lado del servidor TCP
En la programación de Socket, el lado del servidor es mucho más complicado que el lado del cliente. El trabajo del servidor es establecer una terminal de comunicación y esperar pasivamente la conexión del cliente. El siguiente ejemplo de un programa del lado del servidor se utiliza para escuchar el número de puerto obtenido de la entrada de la consola y enviar el mensaje enviado por el cliente.
Copie el código de código de la siguiente manera:
importarjava.net.*;
importjava.text.MessageFormat;
importarjava.io.*;
clase públicaTCPEchoServer{
privatestaticfinalintBUFSIZE=32;
publicstaticvoidmain(String[]args)throwsIOException{
//TODOmétodostub generado automáticamente
//Obtener el número de puerto a monitorear desde la consola
si(argumentos.longitud!=1)
thrownewIllegalArgumentException("Parámetro(s):<Puerto>");
//Obtener el número de puerto
intservPort=Integer.parseInt(args[0]);
//Crear una instancia de un objeto ServerSocket
ServerSocketservSocket=newServerSocket(servPort);
System.out.println(MessageFormat.format("Comenzar a escuchar, número de puerto: {0}",args[0]));
//Número total de bytes de datos recibidos inicialmente
intrecvMsgSize;
//búfer para recibir datos
byte[]receiveBuf=newbyte[BUFSIZE];
// Iteración en bucle, escucha el número de puerto y procesa nuevas solicitudes de conexión
mientras (verdadero) {
// Bloquear y esperar, crear una nueva instancia de conexión cada vez que se recibe una solicitud
SocketclntSocket=servSocket.accept();
//Obtener la dirección de socket del cliente conectado
SocketAddressclientAddress=clntSocket.getRemoteSocketAddress();
//Imprime la información de la dirección del cliente de conexión
System.out.println("Handlingclientat"+clientAddress);
//Objeto que recibe datos del cliente
InputStreamin=clntSocket.getInputStream();
//Objeto que envía datos al cliente
OutputStreamout=clntSocket.getOutputStream();
// Después de leer los datos enviados por el cliente, enviarlos al cliente
while((recvMsgSize=in.read(receiveBuf))!=-1){
out.write(receiveBuf,0,recvMsgSize);
}
//Cuando el cliente cierra la conexión, cierra la conexión
System.out.println("El cliente cierra la conexión");
clntSocket.close();
}
}
}
Cliente TCP
En la programación de Socket, primero el cliente debe enviar al servidor y luego esperar pasivamente la respuesta del servidor. En el siguiente ejemplo: enviamos información al servidor, esperamos el mensaje enviado por el servidor y lo imprimimos.
Copie el código de código de la siguiente manera:
importarjava.io.*;
importjava.net.Socket;
importjava.net.SocketException;
clase públicaTCPEchoClient{
publicstaticvoidmain(String[]args)throwsIOException{
//TODOmétodostub generado automáticamente
//Determinar si los parámetros recibidos de la consola son correctos
if((args.longitud<2)||(args.longitud>3))
thrownewIllegalArgumentException(
"Parámetro(s):<Servidor><Palabra>[<Puerto>]]");
//Obtener la dirección del servidor
Servidor de cadenas=args[0];
//Obtener la información que necesita ser enviada
byte[]datos=args[1].getBytes();
// Si hay tres parámetros esclavos, obtenga el número de puerto para enviar información. El número de puerto predeterminado es 8099.
intservPort=(args.length==3)?Integer.parseInt(args[2]):8099;
// Crea una instancia de Socket según la dirección del servidor y el número de puerto
Socketsocket=newSocket(servidor,servPort);
System.out.println("Conectado al servidor...enviando cadena de eco");
// Devuelve el flujo de entrada de este socket, que es el objeto de datos recibido del servidor
InputStreamin=socket.getInputStream();
// Devuelve el flujo de salida de este socket, que es el objeto de datos enviado al servidor
OutputStreamout=socket.getOutputStream();
//Envía los datos recibidos de la consola al servidor
out.write(datos);
//El contador que recibe datos escribirá el desplazamiento inicial de los datos
inttotalBytesRcvd=0;
//Inicializa el número total de bytes de datos recibidos
intbytesRcvd;
while(totalBytesRcvd<datos.longitud){
//Si el servidor cierra la conexión, devuelve -1. El método de lectura devuelve el número total de bytes de datos recibidos.
if((bytesRcvd=in.read(datos,totalBytesRcvd,datos.longitud
-totalBytesRcvd))==-1)
thrownewSocketException("La conexión con el servidor se ha cerrado");
totalBytesRcvd+=bytesRcvd;
}
//Imprime los datos enviados por el servidor
System.out.println("Recibido:"+newString(datos));
//Cierra la conexión
socket.cerrar();
}
}
Primero ejecute el servidor y escuche en el puerto 8099:
Luego ejecute el programa cliente y envíe un mensaje al servidor:
Mirando nuevamente nuestra consola del lado del servidor, podemos ver la información de la dirección de la conexión del cliente anterior: