Olá!
Estou tentando montar uma sala de batepapo. Pesquisei no fórum e achei vários tópicos e exemplos de códigos que funfionam perfeitamente, porém a maioria desses exemplos funcionam em um único programa, ou seja são passados argumentos para o método principal para que ocorra a inicialização de um servidor ou de um client.
public class SimpleChat
{
public static void main(String[] args)
{
if (args.length < 2)
{
System.out.println("Número inválido de argumentos!");
return;
}
if (args[0].equals("-server"))
{
new SimpleChat().startServer(Integer.parseInt(args[1]));
return;
}
if (args[0].equals("-client"))
{
new SimpleChat().startClient(args[1], Integer.parseInt(args[2]));
return;
}
System.out.println("Argumento inválido " + args[0]);
}
private void startClient(String host, int port)
{
try
{
Socket socket = new Socket();
socket.connect(new InetSocketAddress(host, port));
chat(socket);
}
catch (UnknownHostException e)
{
System.out.println("Host desconhecido");
System.out.println("Host: " + host);
System.out.println("Porta: " + port);
System.exit(2);
}
catch (IOException e)
{
e.printStackTrace();
System.exit(1);
}
}
private void startServer(int porta)
{
try
{
ServerSocket socket = new ServerSocket(porta);
System.out.println("Aguardando conexao...");
Socket s = socket.accept();
chat(s);
} catch (IOException e)
{
System.out.println("Problemas na comunicação: ");
e.printStackTrace();
System.exit(1);
}
}
private void chat(Socket s) throws IOException
{
System.out.println("Conectado com " + s.getRemoteSocketAddress());
listen(s.getInputStream());
talk(s.getOutputStream());
}
/**
* @param outputStream
*/
private void talk(OutputStream outputStream) throws IOException
{
DataOutputStream output = new DataOutputStream(outputStream);
String line = "";
while (!line.equals("EXIT"))
{
Scanner scan = new Scanner(System.in);
line = scan.nextLine();
output.writeInt(line.length());
for (char ch : line.toCharArray())
output.writeChar(ch);
output.flush();
}
}
/**
* @param inputStream
*/
private void listen(final InputStream inputStream)
{
new Thread(new Runnable() {
DataInputStream ds = new DataInputStream(inputStream);
public void run()
{
try
{
while (true)
{
int size = ds.readInt();
int cont = 0;
char[] chars = new char[size];
while (cont < size)
{
chars[cont] = ds.readChar();
cont = cont + 1;
}
String str = new String(chars);
if (str.equals("EXIT"))
{
System.out.println("Conversa terminada.");
System.exit(0);
}
System.out.println(str);
}
} catch (IOException e)
{
}
}
}).start();
}
}
Como podem ver, só há um método "ouvinte" - listen(final InputStream inputStream) - e um método que "fala" - talk(OutputStream outputStream). A minha dúvida:
- Se eu fosse fazer esse chat em programas separados - um o servidor e outro o client - seria necessário o servidor ter um fluxo de entrada e outro de saída e cada client que se conectar ter seu fluxo de entrada e saída próprios?
Desculpe escrever tanto para uma pergunta tão pequena, mas meu propósito era oferecer o maior número de informações para que eu possa ser compreendido.
Grato desde já, Gustavo Borba.