Servidor de eco

ALGUEM PODE ME AJUDAR A ENTENDER PQ MEU PROGRAMA SO CAI NA EXCEÇÃO?

[code]import java.io.;
import java.net.
;

public class ClienteDeEco {

public static void main(String args[]) {
try {
    // para se conectar ao servidor, cria-se objeto Socket.
    // O primeiro parâmetro é o IP ou endereço da máquina que
    // se quer conectar e o segundo é a porta da aplicação.
    // Neste caso, usa-se o IP da máquina local (127.0.0.1)
    // e a porta da aplicação ServidorDeEco (2000).
        Socket conexao = new Socket("localhost", 2000);
        // uma vez estabelecida a comunicação, deve-se obter os
        // objetos que permitem controlar o fluxo de comunicação
        BufferedReader entrada = new BufferedReader(new InputStreamReader(conexao.getInputStream()));
        PrintStream saida = new PrintStream(conexao.getOutputStream());
        String linha;

        // objetos que permitem a leitura do teclado
        BufferedReader teclado = new BufferedReader(new InputStreamReader(System.in));
        // loop principal
            while (true) {
            // lê a linha do teclado
            System.out.print("> ");
            linha = teclado.readLine();
            // envia para o servidor
            saida.println(linha);
            // pega o que o servidor enviou
            linha = entrada.readLine();
            // Verifica se é linha válida, pois se for null a conexão
            // foi interrompida. Se ocorrer isso, termina a execução.
                if (linha == null) {
                System.out.println("Conexão encerrada!");
                break;
                }

                // se a linha não for nula, deve-se imprimi-la no vídeo
                System.out.println(linha);
        }
  } catch (IOException e) {
    // caso ocorra alguma excessão de E/S, mostre qual foi.
    System.out.println("IOException: " + e);

}
}
}[/code]

[code]import java.io.;
import java.net.
;

public class ServidorDeEco {
public static void main(String args[]) {
try {
// criando um socket que fica escutando a porta 2000.
ServerSocket s = new ServerSocket(2000);

        // loop principal.
        while (true) {
            // 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.print("Esperando alguém se conectar...");
            Socket conexao = s.accept();
            System.out.println(" Conectou!");
            // obtendo os objetos de controle do fluxo de comunicação
            BufferedReader entrada = new BufferedReader(new
            InputStreamReader(conexao.getInputStream()));
            PrintStream saida = new
            PrintStream(conexao.getOutputStream());
            // esperando por alguma string do cliente até que ele
            // envie uma linha em branco.
            // Verificar se linha recebida não é nula.
            // Isso ocorre quando conexão é interrompida pelo cliente
            // Se a linha não for null(o objeto existe), podemos usar
            // métodos de comparação de string(caso contrário,estaria
            // tentando chamar um método de um objeto que não existe)
            String linha = entrada.readLine();

            while (linha != null && !(linha.trim().equals(""))) {
            // envia a linha de volta.
            saida.println("Eco: " + linha);
            // espera por uma nova linha.
            linha = entrada.readLine();
            }
            // se o cliente enviou linha em branco, fecha-se conexão.
            conexao.close();
            // e volta-se ao loop, esperando mais alguém se conectar

}
}
catch (IOException e) {
// caso ocorra alguma excessão de E/S, mostre qual foi
System.out.println("IOException: " + e);
}
}
}[/code]

NO CONSOLE APARECE ESSA MENSAGEM PARA O CLIENTE:
IOException: java.net.BindException: Address already in use: JVM_Bind
CONSTRUÍDO COM SUCESSO (tempo total: 0 segundos)

Eu não entendi muito bem esse código. Acho que tem muita coisa faltando nesse código de socket, como o blind.
Esse tutorial explica bem, dá uma olhada.
http://www.riopomba.ifsudestemg.edu.br/dcc/dcc/materiais/1089335456_PAPER%204%20-%20Sockets%20em%20JAVA.pdf

Opa, eu testei aqui e está normal o código.

Pelo erro, provavelmente já tem algum serviço rodando nessa porta (address already in use).

Tenta rodar em outra ou verifica o que está rodando na porta que vc escolheu!

Falou.