Cliente-servidor usando Sokets

Oi, pessoal! sou iniciante em Java e Preciso criar uma Classe cliente e outra Classe servidor utilizando Sokets. Já fiz uma boa parte, mas não está funcionando legal
Não sei se devo criar uma main à parte. Ou deixar como está. Estou colocando junto os códigos para poderem me ajudar. Desde já agradeço À atenção.

Parte I
Classe Cliente, realizar conexão via Sockets com uma máquina remota. Objetos dessa classe devem responder aos seguintes métodos:

*void conecta(String maquina, int porta) que tenta criar uma conexão remota com a máquina na porta dada. Caso consiga, deve criar também fluxos de entrada e saída para comunicação com a maquina. O fluxo de entrada deve utilizar a classe BufferedReader ao invés da DataInputStream.
*void desconecta(String maquina, int porta) que fecha uma conexão remota com a máquina na porta dada.
*void envia(String dado) que envia uma string usando o fluxo de saída
*String recebe() que recebe uma string usando o fluxo de entrada

Parte II
Classe chamada Servidor, aceitar uma conexão via Sockets com uma máquina remota. Objetos dessa classe devem responder aos seguintes métodos:

*void inicia(int porta) criar os sockets necessários para um servidor na porta fornecida.
*void emEspera() deve esperar por uma conexão na porta criada por inicia e, quando houver uma conexão, deve criar fluxos de entrada e saída para comunicação com o cliente. O fluxo de entrada deve utilizar a classe BufferedReader ao invés da DataInputStream.
*void termina(int porta) fecha todos os sockets e fluxos associados à porta.

classe Cliente******

import java.io.*;  // classes para input e output streams
import java.net.*; // classes para socket, serversocket e clientsocket 

class Cliente
{		String maq;
		int por;
	public static void main(String args[])
	{

	
		
	
	
		// cria o stream do teclado**************************************************
		try
		{
		
			BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); 
	
			System.out.println("Digite o nome da máquina: ");
			maq = in.readLine();
	
			System.out.println("Digite a porta da máquina: ");
			por = Integer.parseInt(in.readLine());
		
			if (maq != "bye")
			{
				conecta(maq, por);
			}
			
			else
			{
				desconecta(maq, por);
			}
			
			
		}
		catch (IOException e)
		{
			System.out.println("Houve um erro na entrada de dados");
		}
		//***************************************************************************
	}

	
	
	
	//Cria o ponto de tranporte e conecta ao servidor********************************
	public void conecta(String maquina, int porta)
	{
		String d;
		try
		{
			Socket socket  = new Socket(maquina, porta);
			envia(d);
			
			
		}
		catch(IOException e)
		{
			System.out.println(e.getMessage());
			return;
		}
	}
	//*******************************************************************************
	
	
	
	//Encerra o ponto de tranporte e desconecta do servidor**************************
	public void desconecta(String maquina, int porta)
	{
		try
		{
			Socket socket  = new Socket(maquina, porta);
			socket.close(); 
			
		}
		catch(IOException e)
		{
			System.out.println(e.getMessage());
			return;
		}
	}
	//*******************************************************************************
	
	
	
	
	//Envia dados********************************************************************
	public void envia(String dados)
	{
		Socket socket;
		try
		{	if (dados != "bye")
			{
		
			BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
			// cria os streams (encadeamentos) de entrada e saida com o servidor
			DataOutputStream paraServer = new DataOutputStream(socket.getOutputStream());
   			BufferedReader deServer = new BufferedReader(new InputStreamReader(socket.getInputStream()));

   			// le uma linha do teclado e coloca em sentence
   			dados = in.readLine();

   			// envia a linha para o server
   			paraServer.writeBytes(dados + '\n'); 
   			
   			}
   			else
   			{
   				desconecta(maq, por);
   			}
 
			
		}
		catch(IOException e)
		{
			System.out.println(e.getMessage());
			return;
		}
	}
	//**************************************************	
}

Classe Servidor******

import java.io.*;  // classes para input e output streams
import java.net.*; // classes para socket, serversocket e clientsocket 

class Servidor
{	
	public static void main(String args[])throws Exception
	{
		String dadoCliente;
        int por;
        
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); 
	
				
			System.out.println("Digite a porta da máquina: ");
			por = Integer.parseInt(in.readLine());
			
			inicia(por);
			emEspera(inicia(por));
			termina(por);
        
        
       
	}
	
	
	
	// cria socket de comunicação com os clientes na porta*************************
	public static void inicia(int porta)
	{
		try
		{
		
			ServerSocket Ssocket= new ServerSocket(porta);
			
			
		}
		catch(IOException e)
		{
			System.out.println(e.getMessage());
			return;
		}
	}
	//*****************************************************************************
	
	
	
	
	public static void emEspera()
	{
		try
		{
		
			// espera msg de algum cliente e trata
         	while(true)
         	{

            // espera conexão de algum cliente
            Socket conexaoSocket = Ssocket.accept();

			
			
			//Cria streams de entrada e saida com o cliente que chegou***************
            BufferedReader entradaCliente = new BufferedReader(new InputStreamReader(conexaoSocket.getInputStream()));
            DataOutputStream saidaPCliente = new DataOutputStream(conexaoSocket.getOutputStream());
		}
			
			
		}
		catch(IOException e)
		{
			System.out.println(e.getMessage());
			return;
		}
	}	
	
	
	public static void termina(int porta)
	{
		try{
                
            //Encerro o socket de comunicação
            porta.close();
                
            //Encerro o ServerSocket
            Ssocket.close();
                
            }
        catch(IOException e)
        {
        	System.out.println(e.getMessage());
        }
	}
}
************************************************************

[b][size=“12”]
[color=“red”]

  • Editado: Aumente as chances de alguém responder o seu tópico. Use BBCode em seus códigos para mantê-los identados e mais legíveis para outros usuários. - Matheus[/color][/size][/b] :joia:

Cara,
sua classe cliente e servidor estão certinhas!
O problema deve ser que para conectar vc deve passar o IP da maquina na rede!
E a classe servidor deve rodar primeiro!
E o ideal é vc disparar uma thread para cada cliente que conectar no servidor!
Por que ai vc consegue ter varias coneções!
Essa a é a vantagem do JAVA, vc vai aprender sockets e é obrigado a aprender Trheads!!
haha
Flow!!!