Implementando Checksum usando Java

La suma de comprobación es una técnica de detección de errores que se puede aplicar a mensajes de cualquier longitud. Se utiliza principalmente en las capas de red y transporte del conjunto de protocolos TCP/IP. 
Aquí, hemos considerado los datos decimales que envía el remitente al receptor mediante la programación de sockets. El número de segmentos en los que se dividen los datos aquí depende de la longitud de los datos que se envían. Si la longitud de los datos que se envían es ‘x’, entonces el número de segmentos también es ‘x’, lo que implica que cada segmento tiene datos únicos. Aquí, básicamente tratamos con datos decimales. El concepto también será consistente para los datos de string porque cada carácter de la string se puede representar por su código ASCII equivalente, por lo que nuevamente nos deja con datos decimales.

Prerrequisito: Programación de sockets en Java | Suma de verificación

Ejemplo : 

At sender side :
Enter data length
4
Enter data to send
67
43
0
22
Checksum Calculated is : 90
Data being sent along with Checksum.....
Thanks for the feedback!! 
Message received Successfully! 
At receiver side :
Data received (along with checksum) is
67
43
0
22
90
Sum(in ones complement) is : 127
Calculated Checksum is : 0

Here the checksum calculated at 
the receiver side was 0. Hence, 
it indicates a successful data transfer.

Acercarse : 

En el lado del remitente: 

  1. Primero, pregunte por la longitud de los datos a enviar, para determinar el número de segmentos.
  2. Luego realice un complemento de cada dato ingresado simultáneamente agregándolos. Esto significa que no se requerirá que la suma se complete nuevamente.
  3. Luego envíe los datos junto con la suma de verificación calculada al servidor.
  4. Luego informe la transferencia exitosa del mensaje o de lo contrario dependiendo de los comentarios recibidos del servidor.

En el lado del receptor:

  1. El receptor espera a que lleguen los datos del remitente.
  2. Una vez que se reciben los datos junto con la suma de verificación del remitente, el receptor complementa lo que se recibe y simultáneamente continúa agregándolos.
  3. Finalmente, el receptor complementa la suma anterior y comprueba si el resultado es cero o no, y lo informa al emisor. Un cero indicaría una transferencia de datos exitosa y cualquier otra cosa indicaría un error en los datos que se reciben.

Finalmente , todas las conexiones se cierran por ambos lados.

A continuación se muestra la implementación del enfoque anterior. 

Aquí, «localhost» se usa como IP para configurar la conexión con el número de puerto 5000 abierto para la conexión. El remitente debe comenzar a ejecutarse antes y esperar al receptor.  

Java

// Java code for Checksum_Sender
package checksum_sender;
 
import java.io.*;
import java.net.*;
import java.util.*;
 
public class Checksum_Sender
{
    // Setting maximum data length
    private int MAX = 100;
     
    // initialize socket and I/O streams
    private Socket socket = null;
    private ServerSocket servsock = null;
    private DataInputStream dis = null;
    private DataOutputStream dos = null;
     
    public Checksum_Sender(int port) throws IOException
    {
        servsock = new ServerSocket(port);
         
        // Used to block until a client connects to the server
        socket = servsock.accept();
         
        dis = new DataInputStream(socket.getInputStream());
        dos = new DataOutputStream(socket.getOutputStream());
         
        while (true)
        {
            int i, l, sum = 0, nob;
            Scanner sc = new Scanner(System.in);
            System.out.println("Enter data length");
            l = sc.nextInt();
             
            // Array to hold the data being entered
            int data[] = new int[MAX];
             
            // Array to hold the complement of each data
            int c_data[] = new int[MAX];
             
            System.out.println("Enter data to send");
             
            for (i = 0; i < l; i++)
            {
                data[i] = sc.nextInt();
                 
                // Complementing the entered data
                // Here we find the number of bits required to represent
                // the data, like say 8 requires 1000, i.e 4 bits
                nob = (int)(Math.floor(Math.log(data[i]) / Math.log(2))) + 1;
                 
                // Here we do a XOR of the data with the number 2^n -1,
                // where n is the nob calculated in previous step
                c_data[i] = ((1 << nob) - 1) ^ data[i];
                 
                // Adding the complemented data and storing in sum
                sum += c_data[i];
            }
             
            // The sum(i.e checksum) is also sent along with the data
            data[i] = sum;
            l += 1;
             
            System.out.println("Checksum Calculated is : " + sum);
            System.out.println("Data being sent along with Checksum.....");
             
            // Sends the data length to receiver
            dos.writeInt(l);
             
            // Sends the data one by one to receiver
            for (int j = 0; j < l; j++)
                dos.writeInt(data[j]);
             
            // Displaying appropriate message depending on feedback received
            if (dis.readUTF().equals("success"))
            {  
                System.out.println("Thanks for the feedback!! Message received
                                   Successfully!");
                break;
            }
             
            else if (dis.readUTF().equals("failure"))
            {
                System.out.println("Message was not received successfully!");
                break;
            }
        }
         
        // Closing all connections
        dis.close();
        dos.close();
        socket.close();
    }
 
    // Driver Method
    public static void main(String args[]) throws IOException
    {
        Checksum_Sender cs = new Checksum_Sender(45678);
    }
}

Java

// Java code for Checksum_Receiver
package checksum_sender;
 
import java.net.*;
import java.io.*;
import java.util.*;
  
public class Checksum_Receiver {
     
    // Initialize socket and I/O streams
    private Socket s = null;
    private DataInputStream dis = null;
    private DataOutputStream dos = null;
     
    // Constructor to put ip address and port
    public Checksum_Receiver(InetAddress ip,int port)throws IOException
    {
         
        // Opens a socket for connection
        s = new Socket(ip,port);
         
        dis = new DataInputStream(s.getInputStream());
        dos = new DataOutputStream(s.getOutputStream());
         
        while (true)
        {   Scanner sc = new Scanner(System.in);
            int i, l, nob, sum = 0, chk_sum;
             
            // Reads the data length sent by sender
            l = dis.readInt();
             
            // Initializes the arrays based on data length received
            int c_data[] = new int[l];
            int data[] = new int[l];
             
            System.out.println("Data received (along with checksum) is");
             
            for(i = 0; i< data.length; i++)
            {  
                // Reading the data being sent one by one
                data[i] = dis.readInt();
                System.out.println(data[i]);
                 
                // Complementing the data being received
                nob = (int)(Math.floor(Math.log(data[i]) / Math.log(2))) + 1;
                c_data[i] = ((1 << nob) - 1) ^ data[i];
                 
                // Adding the complemented data
                sum += c_data[i];
            }
            System.out.println("Sum(in ones complement) is : "+sum);
             
            // Complementing the sum
            nob = (int)(Math.floor(Math.log(sum) / Math.log(2))) + 1;
            sum = ((1 << nob) - 1) ^ sum;
            System.out.println("Calculated Checksum is : "+sum);
             
            // Checking whether final result is 0 or something else
            // and sending feedback accordingly
            if(sum == 0)
            {  
                dos.writeUTF("success");
                break;
            }    
            else
            {  
                dos.writeUTF("failure");
                break;
            }
        }
         
        // Closing all connections
        dis.close();
        dos.close();
        s.close();
    }
     
    // Driver Method
    public static void main(String args[])throws IOException
    {  
        // Getting ip address on which the receiver is running
        // Here, it is "localhost"
        InetAddress ip = InetAddress.getLocalHost();
        Checksum_Receiver cr = new Checksum_Receiver(ip,5000);
    }   
}

Producción: 

Publicación traducida automáticamente

Artículo escrito por SaagnikAdhikary y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *