Código de Servidor para intercalar letras

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.

[code]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();
    }
}

}[/code]

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?

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

Era isso mesmo, muito obrigado!

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.

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.

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

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

[quote=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[/quote]

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

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.