Socket Multi Thread Server - Java Server and Client in C ++

7

I have to develop a Mini Socket Multi Thread Server (college work) in Java and I need to make a Client in C, for example, it can be in any language, but I chose those two.

How do I send the values from the Client to the Server?

For example, when I log in, the options for a calculator appear and I enter two values in the Client (are you sure?) and I want the Server to read those numbers and return to the Client. (Is that so?). And how can I more or less implement it?

Follow the classes.

Server.java

package br.com.sockets;

import java.io.*;
import java.net.*;
import java.util.Scanner;

public class Server implements Runnable {
public Socket client;
private static ServerSocket servidor;
public Scanner input;
//private Scanner op;

public Server(Socket cliente){
    this.client = cliente;
}

public static void main(String[] args)  throws IOException{     

    servidor = new ServerSocket (8080);
    System.out.println("Porta 8080 aberta!");

    /*Aguarda alguém se conectar. A execução do servidor
    fica bloqueada na chamada do método accept da classe
    ServerSocket. Quando alguém se conectar ao servidor, o
    método desbloqueia e retorna com um objeto da classe
    Socket, que é uma porta da comunicação.*/
    System.out.println("Aguardando conexão do cliente...");   

    while (true) {
      Socket cliente = servidor.accept(); 

      // Cria uma thread do servidor para tratar a conexão
      Server tratamento = new Server(cliente);
      Thread t = new Thread(tratamento);

      // Inicia a thread para o cliente conectado
      t.start();
    }
}

/* A classe Thread, que foi instanciada no servidor, implementa Runnable.
   Implementação da lógica de troca de mensagens dentro deste método 'run'.
*/
public void run(){
    System.out.println("Nova conexão com o cliente " +         this.client.getInetAddress().getHostAddress());

    try {
        Scanner s = null;
        s = new Scanner(this.client.getInputStream());

        System.out.println("\nOlá, " + this.client.getInetAddress().getHostAddress() + 
                " você se conectou ao Servidor com calculadora\n");

        /*int sum, sub, mult, div, valueOne, valueTwo;


        System.out.println("\nDigite uma opção:" + op);
        int sw = s.nextInt(); 
        System.out.println("\n1 - Soma");
        System.out.println("\n2 - Subtração");
        System.out.println("\n3 - Multiplicação");
        System.out.println("\n4 - Divisão");
        System.out.println("\n0 - Sair"); 

        switch(sw){

            case 1:
                //input = new Scanner(System.in); 
                System.out.println("Digite o primeiro valor:");
                valueOne = s.nextInt();
                System.out.println("Digite o segundo valor:");
                valueTwo = s.nextInt();
                sum = valueOne + valueTwo;
                System.out.println("\nResultado da soma: " + sum);
                break;

            case 2:
                //input = new Scanner(System.in); 
                System.out.println("Digite o primeiro valor:");
                valueOne = s.nextInt();
                System.out.println("Digite o segundo valor:");
                valueTwo = s.nextInt();
                sub = valueOne - valueTwo;
                System.out.println("\nResultado da subtração: " + sub);
                break;

            case 3: 
                //input = new Scanner(System.in); 
                System.out.println("Digite o primeiro valor:");
                valueOne = s.nextInt();
                System.out.println("Digite o segundo valor:");
                valueTwo = s.nextInt();
                mult = valueOne * valueTwo;
                System.out.println("\nResultado da multiplicação: " + mult);
                break;

            case 4: 
                //input = new Scanner(System.in); 
                System.out.println("Digite o primeiro valor:");
                valueOne = s.nextInt();
                System.out.println("Digite o segundo valor:");
                valueTwo = s.nextInt();
                div = valueOne / valueTwo;
                System.out.println("\nResultado da divisão: " + div);
                break;

            //default:
                //System.out.printf("Você digitou uma operação inválida."); 
            }*/

            //Exibe mensagem no console
            while(s.hasNextLine()){
                System.out.println(s.nextLine());
            } 

            //Finaliza objetos
            s.close();
            this.client.close();
        } catch (IOException e) { 
          e.printStackTrace();
          } 

    }
} 


cliente.c

#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h> 
#include <sys/socket.h>
#include <netdb.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/ioctl.h>
#include <ctype.h>
#include <string.h>

  int configuracaoCliente()
{

   /*Descritor do cliente*/
   int clienteSockfd;

  /*Estrutura do Cliente*/
  struct sockaddr_in serv_addr;

  /*Tamanho da estrutura*/
  socklen_t addrlen = sizeof (serv_addr);

  /*Socket familia TCP declarado SOCK_STREAM e criado*/
clienteSockfd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
if (clienteSockfd < 0)
{
    printf("Erro no Socket\n");
    exit(1);
}

      /*Zera a estrutura*/
     bzero((char *) & serv_addr, sizeof (serv_addr));

     /*Seta a familia*/
     serv_addr.sin_family = AF_INET;

     /*Define o IP nesse caso o localhost*/
     serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");

    /*Define a porta de conexao*/
    serv_addr.sin_port = htons(8080);

    /*Faz a conexao com o servidor*/
   if(connect(clienteSockfd,(struct sockaddr *)&serv_addr, addrlen) < 0)
    {
        printf("Erro no Socket\n");
    exit(1);
}
    return clienteSockfd;
}

   void Cliente(int clienteSockfd)
   {

  /*Buffer de dados a ser mandado para o servidor*/
  char buffer_para_servidor[12560];
  //printf("Digite uma mensagem para o servidor: ");

 int input, valor1, valor2;

   printf("Servidor com calculadora\n");
  printf("1. Soma\n");
  printf("2. Subtração\n");
  printf("3. Multiplicação\n");
  printf("4. Divisão\n");
  printf("0. Sair\n");
  printf("Escolha a opção: \n");
  scanf("%d", &input);

  switch(input){

   case 1: printf("Digite o valor 1");
           scanf("%d", &valor1);
           printf("Digite o valor 2");
           scanf("%d", &valor2);
           /*sum = valor1 + valor2;
           scanf("%d", &sum);
           printf("Resultado da soma: ", sum);*/
           break;

   case 2: printf("Digite o valor 1");
           scanf("%d", &valor1);
           printf("Digite o valor 2");
           scanf("%d", &valor2);
           /*sub = valor1 + valor2;
           scanf("%d", &sub);
           printf("Resultado da subtração: ", sub);*/
           break;

   case 3: printf("Digite o valor 1");
           scanf("%d", &valor1);
           printf("Digite o valor 2");
           scanf("%d", &valor2);
           /*mult = valor1 + valor2;
           scanf("%d", &mult);
           printf("Resultado da multiplicação: ", mult);*/
           break;

   case 4: printf("Digite o valor 1");
           scanf("%d", &valor1);
           printf("Digite o valor 2");
           scanf("%d", &valor2);
           /*sum = valor1 + valor2;
           scanf("%d", &sum);
           printf("Resultado da divisão: ", sum);*/
           break;

   default: printf("Opção inválida!");
   break;
  }
   do {

    scanf("%s",buffer_para_servidor);
    fflush(stdin);

     /*Escreve para o servidor*/

    write(clienteSockfd, buffer_para_servidor, sizeof      (buffer_para_servidor));


 /*Mensagem para sair*/
} while (strcmp(buffer_para_servidor, "sair") != 0);

 /**Encerra o descritor*/
close(clienteSockfd);
}

int main()
{
system("clear");

 /*Estrutura cliente*/
struct sockaddr_in serv_addr;

 /*Tamanho da estrutura*/
socklen_t addrlen = sizeof (serv_addr);

 /*Define o descritor cliente*/
int descritorCliente;
descritorCliente = configuracaoCliente();

 /*chama funcao do cliente passando o descritor*/
Cliente(descritorCliente);
exit(0);
}
    
asked by anonymous 15.05.2015 / 20:29

1 answer

4

estevammr, as I do not know java very well I will talk about the client.c

Put the read () function log after the following excerpt.

 write(clienteSockfd, buffer_para_servidor, sizeof(buffer_para_servidor));

would be something like:

read(clienteSockfd, variavel_para_armazenar_valor_recebido, tamanho_a_ser_lido);

This way the client will expect to receive something from the server before moving on.

I recommend doing both in C if that's possible.

Here are 2 examples that can help (they do not have threads but work with sockets).

C socket server

Client socket in C

    
28.05.2015 / 20:03