Série da semana: Primeiros passos no React

Veja mais

Problema de loop infinito no while (SOCKET - JAVA)

17/03/2016

1

Bom dia! Estou fazendo um projeto da faculdade um socket em java, onde o cliente envia mensagens ao servidor. Além das mensagens, também deve enviar arquivo! Está funcionando tudo corretamente, o servidor consegue enviar o arquivo para o cliente, porém ele fica preso em um loop WHILE. Já tentei de tudo! Tudo o que eu tentei mudar não adiantou. Alguem pode me ajudar? Existem duas classes, uma pro servidor e outra pro cliente, o cliente envia mensagem pro servidor e quando é digitado a palavra "ARQ", o servidor entende que tem que enviar o arquivo. Vou disponbilisar primeiro o código da classe do servidor e depois do cliente, o problema está no WHILE do CLIENTE!!! Irei comentar em cima do while, mostrando que é nele que está o "erro" (loop infinito):

//CLASSE SERVIDOR (ServidorChat):
package socket;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

/**
*
* @author Matheus
*/
public class ServidorChat {

/**
* @param args the command line arguments
*/
public static void main(String[] args) {
ServidorChat servidor = new ServidorChat(); // Criando servidor
servidor.aguardarConexaoCliente(); // Aguardar conexao de cliente para transferia
}

private void aguardarConexaoCliente() {
// Checa se a transferencia foi completada com sucesso
//OutputStream out = null;
ServerSocket servsock = null;
FileInputStream finp = null;


//try{
/*servsock = new ServerSocket(13267);
System.out.println("Porta de conexao aberta 13267");
Socket socket = servsock.accept();
System.out.println("Conexao recebida pelo cliente");

Scanner scanner = new Scanner(System.in);
InputStream input = socket.getInputStream();
OutputStream output = socket.getOutputStream();

BufferedReader in = new BufferedReader(new InputStreamReader(input));
PrintStream out = new PrintStream(output);*/

try{
servsock = new ServerSocket(13267); //ServerSocket informa-se apenas a porta, pois ele assumirá o IP da rede padrão.
System.out.println("Porta de conexao aberta 13267");
Socket socket = servsock.accept(); /*Invoca-se o método accept do obj ServerSocket p/ que o servidor receba conexão do cliente.
Esse método espera por novas conexões. Quando uma nova conexão é estabelecida, ele retorna
um obj Socket conectado ao cliente. Esse obj Socket, pode-se enviar dados p/ o cliente e
recebê-los. */
System.out.println("Conexao recebida pelo cliente");

Scanner scanner = new Scanner(System.in);

/*O InputStream do cliente está conectado ao OutputStream do servidor e o InputStream do servidor está conectado ao
OutputStream do cliente. Quando um grava, o outro lê, e vice-versa: */
InputStream input = socket.getInputStream();
OutputStream output = socket.getOutputStream();

/*Transformamos o InputStream (que oferece uma interface para leitura de byte) em um BufferedReader (que oferece uma interface
para leituras de Strings): */
BufferedReader in = new BufferedReader(new InputStreamReader(input));

/*Transformamos o OutputStream (que oferece uma interface para leitura de byte) em um PrintStream (que oferece uma interface
para gravação de Strings): */
PrintStream out = new PrintStream(output);

//Após a criação desses dois objs acima, podemos ler msgs do cliente e grava msgs p/ o cliente.


while(true){ //Lógica p/ ecoar a msg do cliente.
String mensagem = in.readLine(); //Lê a msg enviada pelo cliente.

System.out.println("Mensagem recebida do cliente [" + socket.getInetAddress().getHostName() + "]: " + mensagem);

if ("ARQ".equals(mensagem)){ //Se a mensagem for "ARQ", enviar arquivo p/ cliente

// Criando tamanho de leitura:
byte[] cbuffer = new byte[1024];
int bytesRead;

// Criando arquivo que sera transferido pelo servidor
File file = new File("C:\\Users\\Matheus\\Desktop\\imagem.jpg");
finp = new FileInputStream(file);
System.out.println("Lendo arquivo...");

output = socket.getOutputStream(); // Criando canal de transferencia

// Lendo arquivo criado e enviado para o canal de transferencia:
System.out.println("Enviando Arquivo...");
while ((bytesRead = finp.read(cbuffer)) != -1) {
output.write(cbuffer, 0, bytesRead);
output.flush();
}
System.out.println("Arquivo Enviado!");
}

if ("EXIT".equals(mensagem)){ //Se a msg for "EXIT", encerrar o laço.
break;
}
out.println(mensagem); //Se não, ecoar a msg p/ o cliente.
}
servsock.close(); //Fechando o Socket.
finp.close(); //Fechando o FileInput
out.close(); //Fechando o OutputStream.

}catch(Exception e){
}

/*try{
//servsock = new ServerSocket(13267);
//System.out.println("Porta de conexao aberta 13267");

}catch(Exception e){
}*/


//}catch(Exception e){
//}
}

}
---------------------------------------------------------------------------
//AGORA A CLASSE CLIENTE (ClienteChat). INDICAREI O WHILE POR COMENTÁRIO
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package socket;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner;

/**
*
* @author Matheus
*/
public class ClienteChat {
public static void main(String[] args) {
ClienteChat cliente = new ClienteChat(); //Criando Classe cliente para receber arquivo
cliente.solicitarArqServidor(); //Solicitando arquivo
}

private void solicitarArqServidor() {
Socket socketServer = null;
FileOutputStream fout = null;
//InputStream inp = null;
//OutputStream out = null;
//try{
/*InputStream input = socketServer.getInputStream();
OutputStream output = socketServer.getOutputStream();

BufferedReader in = new BufferedReader(new InputStreamReader(input));
PrintStream out = new PrintStream(output);*/


try{

System.out.println("Conectando com o servidor PORTA 13267");
socketServer = new Socket("localhost", 13267); /*Informando IP e porta do servidor. Usa-se localhost (ou 127.0.0.1), pois o
cliente e o servidor encontram-se na mesma máquina. */
//inp =socketServer.getInputStream();

/*O InputStream do cliente está conectado ao OutputStream do servidor e o InputStream do servidor está conectado ao
OutputStream do cliente. Quando um grava, o outro lê, e vice-versa: */
InputStream input = socketServer.getInputStream();
OutputStream output = socketServer.getOutputStream();

/*Transformamos o InputStream (que oferece uma interface para leitura de byte) em um BufferedReader (que oferece uma interface
para leituras de Strings): */
BufferedReader in = new BufferedReader(new InputStreamReader(input));

/*Transformamos o OutputStream (que oferece uma interface para leitura de byte) em um PrintStream (que oferece uma interface
para gravação de Strings): */
PrintStream out = new PrintStream(output);

//Após a criação desses dois objs acima, podemos grava msgs p/ o servidor e ler msgs do servidor.

Scanner scanner = new Scanner(System.in);

while(true){ //Lógica p/ ecoar a msg do cliente.
System.out.println("Digite uma mensagem: ");
String mensagem = scanner.nextLine(); //Lê a msg enviada pelo cliente.

out.println(mensagem); //ecoar a msg p/ o cliente.
if ("ARQ".equals(mensagem)){ //Se a mnsagem for "ARQ", solicitar arquivo p/ servidor
fout = new FileOutputStream(new File("C:\\Users\\Matheus\\Desktop\\imagem1.jpg")); // Cria arquivo local no cliente
System.out.println("Arquivo Local Criado C:\\Users\\Matheus\\Desktop\\imagem1.jpg");

// Prepara variaveis para transferencia:
byte[] cbuffer = new byte[1024];
int bytesRead;

System.out.println("Recebendo arquivo...");

// Copia conteudo do canal:
while((bytesRead = input.read(cbuffer)) != -1){
fout.write(cbuffer, 0, bytesRead);
fout.flush();
}

System.out.println("Arquivo recebido!");
}

else if("EXIT".equals(mensagem)){ //Se a msg for "EXIT", encerrar o laço.
break;
}
else{
mensagem = in.readLine(); //Se não, aguardar resposta do servidor.
System.out.println("Mensage recebida no servidor: " + mensagem); //Imprime msg recebida no console.
}
}
socketServer.close(); //Fechando o Socket.
out.close(); //Fechando o OutputStream.
in.close(); //Fechando o InputStream.
fout.close(); //Fechando o OutputStream.
}catch(Exception e){
}
//}catch(Exception e){
//}

}
}
Responder

Posts

17/03/2016

Matheus Rocha

ESQUECI DE COMENTAR QUAL WHILE ESTAVA O PROBLEMA!!!!
ESTÁ NESSE AQUI (DA CLASSE ClienteChat):
// Copia conteudo do canal:
while((bytesRead = input.read(cbuffer)) != -1){
fout.write(cbuffer, 0, bytesRead);
fout.flush();
}

//NÃO SAI DESSE LOOP!!!
Responder