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