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

Asked

Viewed 1,276 times

6

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

How do I send the Client values to the Server?

For example, when I log in I see the options of a calculator and enter two values that in the Client (right?) and I want the Server to read these numbers and return to the Client. (Is that so?). And how more or less I can implement it?

Follows 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);
}

1 answer

4


estevammr, as I do not know java very well I will speak of the client. c

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

 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 possible.

Here are 2 examples that can help (they don’t have threads but work with sockets).

Server socket in C

Client socket in C

  • Thanks friend!

  • No problem my dear! I hope for sure your server.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.