Código de Servidor para intercalar letras

8 respostas
muniquewassem

Oi pessoal!

To com um problema em um código de um 'servidor' que estou escrevendo, é bem pouca coisa, só tenho que receber a mensagem e retorna-la com letras maiúsculas e minúsculas intercaladas, tipo: RoDa AsSiM mEsMo
Mas infelizmente, apesar da maioria das letras tendo saída correta ainda estou com uns probleminhas.

import java.io.*;
import java.net.*;


public class tcpServer{
    public static void main(String[] args)throws IOException {
    // Verifica se a qtide de parâmetros de entrada está correta

        if(args.length != 1){
            System.out.println("> Uso: java tcpServidor Porta");
            System.exit(0);
        }

        ServerSocket soqueteEsperaConexao = new ServerSocket( Integer.parseInt( args[0]));
        System.out.println("Servidor rodando: " + soqueteEsperaConexao);

        try{
            while (true) {
                Socket socket = soqueteEsperaConexao.accept();
                try {
                    System.out.println(">Conexão aceita: " + socket);
                    BufferedReader fluxoEntrada = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                    String mensagem = fluxoEntrada.readLine();
                    System.out.println(">mensagem recebida do cliente: " + mensagem + "\n");
                    PrintWriter fluxosaida = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
                    StringBuilder sb  = new StringBuilder(); //cria nova referencia de stringbuilder

                    for (int i = 0; i < mensagem.length(); i++) { //loop para por toda mensagem
                        char ch = mensagem.charAt(i); //usa charAt para pegar um indice do array de caracteres
                        sb.append(i % 2 == 0 ? (char) (ch & 95) : (char)(ch | 32));
                    }
        fluxosaida.println(sb.toString());//transforma o stringbuilder para string
                }finally{
                    socket.close();
                }
            }//fim while
        }finally{
            soqueteEsperaConexao.close();
        }
    }
}

O argumento que estou passando no cliente é 'teste do servidor' e o servidor retorna 'TeStE Do sErViDoR', mas deveria ser 'TeStE dO sErViDoR'.

Alguém ai pode me dar uma luz de como arrumar isso?

8 Respostas

D

Acho que o problema é que vc está usando o i para verificar se deve converter para maiúsculo ou não.
Dá uma olhada no código abaixo. Testei aqui e parece que está fazendo o que vc quer.

int cont = 0;
for (int i = 0; i < mensagem.length(); i++) { //loop para por toda mensagem
	if (!Character.isLetter(mensagem.charAt(i))) {
		sb.append(mensagem.charAt(i));
		continue;
	}
	if (cont % 2 == 0) {
		sb.append(Character.toUpperCase(mensagem.charAt(i)));
	} else {
		sb.append(mensagem.charAt(i));
	}
	cont++;
}
muniquewassem

Era isso mesmo, muito obrigado!

J

Fiquei interessado nesse código , mas me surgiu uma pergunta:

“E se eu quiser que a primeira letra de cada palavra seja maiuscula, qual a alteração que eu faço?” por curiosidade testei aqui e não consegui fazer isso.

claudneto

Josielplens, tenta verificar se o caracter em análise seja um espaço, se for, o próximo caracter vc converte pra maiúsculo, se não for, vc deixa minúsculo.

J

eu pensei nisso, mas não consegui formular algo que se encaixe para essa função.

kenneth

Talvez algo como:

for (int i = 0; i < mensagem.length(); i++) { //loop para por toda mensagem  
      char ch = mensagem.charAt(i); //usa charAt para pegar um indice do array de caracteres  
     
      // teste se o caracter eh espaco em branco
      if (ch == ' ') continue;

      sb.append(i % 2 == 0 ? (char) (ch & 95) : (char)(ch | 32));  
}

Abraco

J

kenneth:
Talvez algo como:

for (int i = 0; i < mensagem.length(); i++) { //loop para por toda mensagem  
      char ch = mensagem.charAt(i); //usa charAt para pegar um indice do array de caracteres  
     
      // teste se o caracter eh espaco em branco
      if (ch == ' ') continue;

      sb.append(i % 2 == 0 ? (char) (ch & 95) : (char)(ch | 32));  
}

Abraco

olá amigo mas pode me explicar a seguinte linha sb.append(i % 2 == 0 ? (char) (ch & 95) : (char)(ch | 32)); eu sei que o appendi, anexa o caractere a string , mas o restante eu brequei pra entender ahsuahsuahs

kenneth

Bom…
Posso estar falando asneira, mas la vai:

Todo caracter tem um codigo na tabela ASCII, sendo que caracteres minusculos tem codigos
diferente de maiusculos, ou seja, ‘a’ eh um codigo, e ‘A’ eh outro.

Basicamente, essa linha testa se a posicao atual eh par (i % 2 == 0), e diante desta condicao
retorna o codigo da tabela do caracter maiusculo ou minusculo, e converte para char.

Nao sei se deu pra sacar…

Abraco.

Criado 26 de abril de 2011
Ultima resposta 29 de abr. de 2011
Respostas 8
Participantes 5