Olá a todos, eu estou tentando desenvolver um chat, onde a conversa sera gravada nao
no servidor, mas em um arquivo texto… Eu n tenho idéia de como eu posso fazer isso
Se puderem me ajudar…
Olá a todos, eu estou tentando desenvolver um chat, onde a conversa sera gravada nao
no servidor, mas em um arquivo texto… Eu n tenho idéia de como eu posso fazer isso
Se puderem me ajudar…
Olha, cara… eu nunca fiz isso, e nem sei se seria viável.
Porém, lendo o problema que você tem em mãos, me veio à cabeça usar log4j e FileAppenders.
talvez alguém com mais experiência possa te ajudar melhor, mas fica algo pra você pesquisar 
Abraço!
E você não pode usar um PrintWriter por que…?
O bate-papo tem que ser assim:
Um servidor(eu) em um chat com um cliente, onde as informações dizem respeito a negócios, ou seja, informações importantes…
2 coisas: Preciso garantir que se a conexão fracassar, eu tenha pelo menos uma cópia da conversa e não posso sobrecarregar
o servidor de informações…
Me disseram que a melhor opção seria um arquivo txt… Como eu posso fazer isso ?
Pessoal…
Consegui gravar o que o usuário digita em um txt, mas eu so consigo gravar a 1ª coisa q ele digita…
abaixo, postarei o código completo, se puderem me ajudar, to desesperado pq num to conseguindo…
Cliente:
public class Cliente extends JFrame{
JTextField txtEnviar;
Socket socket;
PrintWriter saida;
BufferedReader reader;
JTextArea incoming;
GridBagConstraints cons = new GridBagConstraints();
public Cliente(){
super("Chat Cliente");
setUpNetworking();
Container janela = this.getContentPane();
janela.setLayout(new GridBagLayout());
cons.gridx = 0;
cons.gridy = 0;
cons.gridwidth = 6;
cons.gridheight = 3;
incoming = new JTextArea(15,50);
incoming.setLineWrap(true);
incoming.setWrapStyleWord(true);
incoming.setEditable(false);
JScrollPane scroll = new JScrollPane(incoming);
scroll.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
scroll.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
scroll.setPreferredSize(new Dimension(300,100));
janela.add(scroll,cons);
cons.fill = GridBagConstraints.BOTH;
cons.gridx = 1;
cons.gridy = 4;
cons.gridwidth = 1;
cons.gridheight = 1;
txtEnviar = new JTextField();
txtEnviar.setPreferredSize(new Dimension(100,30));
janela.add(txtEnviar, cons);
cons.gridx = 3;
cons.gridy = 4;
JButton btn = new JButton("Enviar");
btn.addActionListener(new Enviar());
janela.add(btn,cons);
Thread thread = new Thread(new IncomingReader());
thread.start();
}
public void setUpNetworking(){
try {
socket = new Socket("127.0.0.1", 4242);
InputStreamReader streamReader = new InputStreamReader(socket.getInputStream());
reader = new BufferedReader(streamReader);
saida = new PrintWriter(socket.getOutputStream());
System.out.println("Conexão estabelecida");
} catch (UnknownHostException e1) {
e1.printStackTrace();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
public static void main(String [] args){
Cliente cli = new Cliente();
cli.setSize(400,400);
cli.setLocationRelativeTo(null);
cli.setState(JFrame.MAXIMIZED_BOTH);
cli.setVisible(true);
cli.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
class IncomingReader implements Runnable{
@Override
public void run() {
String message;
try{
while((message = reader.readLine()) != null){
System.out.println("read "+message);
incoming.append(message+"\n");
}
}
catch(Exception e1){
}
}
}
class Enviar implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
try{
saida.println(txtEnviar.getText());
saida.flush();
}
catch(Exception e1){
e1.printStackTrace();
}
txtEnviar.setText("");
txtEnviar.requestFocus();
}
}
}
Servidor:
public class Servidor{
JLabel lblNome;
String string = "";
InputStreamReader stream;
ArrayList clienteOutPutSteams;
@SuppressWarnings("rawtypes")
public void go(JFrame f){
clienteOutPutSteams = new ArrayList();
try{
ServerSocket servidor = new ServerSocket(4242);
while(true){
Socket sock = servidor.accept();
PrintWriter writer = new PrintWriter(sock.getOutputStream());
clienteOutPutSteams.add(writer);
Thread t = new Thread(new ClienteHandler(sock));
t.start();
System.out.println("Conectado...");
}
}
catch(Exception e){
e.printStackTrace();
}
}
public Servidor(){
JFrame frm = new JFrame();
frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frm.setSize(160, 160);
frm.setVisible(true);
frm.setLocationRelativeTo(null);
frm.setResizable(false);
lblNome = new JLabel("Conexão estabelecida ...");
frm.getContentPane().add(lblNome);
go(frm);
}
public static void main(String [] args){
new Servidor();
}
public class ClienteHandler implements Runnable{
BufferedReader reader;
Socket socket;
public ClienteHandler(Socket sock) {
try {
socket = sock;
InputStreamReader isReader;
isReader = new InputStreamReader(socket.getInputStream());
reader = new BufferedReader(isReader);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void run() {
try {
stream = new InputStreamReader(socket.getInputStream());
BufferedReader ler = new BufferedReader(stream);
File file = new File("ArquivoJava.txt");
FileReader fileReader = new FileReader(file);
BufferedReader bufferedReader = new BufferedReader(fileReader);
string = "";
String linha = "";
while ( ( linha = bufferedReader.readLine() ) != null) {
string += linha + "\n";
}
JOptionPane.showMessageDialog(null, string);
FileOutputStream fos = new FileOutputStream("ArquivoJava.txt");
String texto = ler.readLine()+"\n";
fos.write(string.getBytes());
fos.write(texto.getBytes());
fos.close(); /
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
PS: ainda não esta sendo adicionado a conversa no JTextArea
fi = new File("Aqui o caminho do arquivo que deseja salvar");
f = new FileWriter(fi,true);// segundo parametro true , significa para dar append no arquivo .
f.write("Aqui Escreve Sua String");
Finalmente, agora eu consigo gravar tudo o que o usuário digita no txt...
Tudo graças a essa linha: while(true){
Servidor:public void run() {
while(true){
try {
stream = new InputStreamReader(socket.getInputStream());
BufferedReader ler = new BufferedReader(stream);
File file = new File("ArquivoJava.txt");
FileWriter f = new FileWriter(file,true);
FileReader fileReader = new FileReader(file);
BufferedReader bufferedReader = new BufferedReader(fileReader);
string = "";
String linha = "";
while ( ( linha = bufferedReader.readLine() ) != null) {
//Aqui imprimimos a linha
string += linha + "\n";
}
FileWriter fos = new FileWriter("ArquivoJava.txt",true); // Perceba que estamos instanciando uma classe aqui. A FileOutputStream. Pesquise sobre ela!
String texto = ler.readLine()+"\n";
fos.write(texto);
fos.close(); // Fecha o arquivo. Nunca esquecer disso.
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Agora: como eu seto o texto do txt no JTextArea do cliente, ja que o txt vai ficar no servidor...
Detalhe: preciso fazer com que o JTextArea seja atualizado assim que uma mensagem e enviada...
EDIT: Deu um problema aqui... Quando o usuário fecha o form, ele ainda continua executando... O que esta dando errado ????
Nossa, gente ta dificil… Nunca pensei q um chat simples me daria tanto trabalho…
Consegui enviar para o servidor e gravar no Txt, depois de muito tempo tentando... Abaixo o código do Servidor...
Agora, eu preciso saber como eu posso setar o texto no txt no JTextArea do usuário em tempo de execução,
Tipo: quando algo for gravado no txt, eu setar para todos os usuários nos TextAreas de todos os usuários...
@Override
public void run() {
try {
stream = new InputStreamReader(socket.getInputStream());
BufferedReader ler = new BufferedReader(stream);
String texto = " ";
out:
while(texto != null){
texto = ler.readLine();
if(texto == null){
break out;
}
else{
System.out.println(texto);
File file = new File("ArquivoJava.txt");
FileWriter f = new FileWriter(file,true);
FileWriter fos = new FileWriter("ArquivoJava.txt",true);
fos.write(texto);
fos.write("\n");
fos.close();
f.close();
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Se puderem me ajudar...
Olá
JTextAreaDoCliente.setText( texto );
Na parte onde o cliente lê os dados não funciona?
Na verdade eu não sei como fazer para setar isso assim que alguma mudança ocorrer no txt…
Provavelmente você está usando threads né? e provavelmente na sua classe cliente tem um loop while que fica o tempo todo lendo o fluxo. Configure a area de texto nesse loop perto de onde voce pega o texto para ler.
Entao, eu consegui apresentar na JTextArea,mas to com um problema:
Toda vez que eu adiciono algo no txt, ele acrescenta todo o txt no JTextArea todo…
Tipo:
o txt tem a palavra TESTE. Eu adiciono TESTE 2, dai ele apresenta na JTextArea
TESTE
TESTE2
ai, adiciono TESTE3, dai ele adiciona
TESTE
TESTE2
TESTE
TESTE2
TESTE3
Como eu paro isso e apresento so
TESTE
TESTE2
TESTE3
:?:
Aqui esta a classe Runnable do Cliente
class IncomingReader implements Runnable{
@Override
public void run() {
String message = "";
try{
while((message = reader.readLine()) != null){
incoming.append(message+"\n");
}
}
catch(Exception e1){
e1.printStackTrace();
}
}
}
public void falarTodos(String msg){
try {
File file = new File("ArquivoJava.txt");
FileReader fileReader = new FileReader(file);
BufferedReader bufferedReader = new BufferedReader(fileReader);
string = "";
String linha = "";
while ( ( linha = bufferedReader.readLine() ) != null) {
//Aqui imprimimos a linha
string += linha + "\n";
}
System.out.println(string);
write = new PrintWriter(socket.getOutputStream());
write.println(string);
write.flush();
}
catch(Exception e){
e.printStackTrace();
}
}
Ao invés de usar:
incoming.append(message+"\n");
tenta usar o setText:
incoming.setText(message+"\n");
Num da, ele sobre escreve qualquer coisa… pq ta num whule…
Tipo, se eu tiver
TESTE
LOL
ele so escreveria o LOL
Num da, ele sobre escreve qualquer coisa… pq ta num whule…Tipo, se eu tiver
TESTE
LOLele so escreveria o LOL
Eu não estou entendendo porque com o append ele ta repetindo as coisas como você falou no outro post.
Esse código que escreve no servidor o que esta no txt...
public void falarTodos(String msg){
try {
File file = new File("ArquivoJava.txt");
FileReader fileReader = new FileReader(file);
BufferedReader bufferedReader = new BufferedReader(fileReader);
string = "";
String linha = "";
while ( ( linha = bufferedReader.readLine() ) != null) {
//Aqui imprimimos a linha
string += linha + "\n";
}
System.out.println(string);
write = new PrintWriter(socket.getOutputStream());
write.println(string);
write.flush();
}
catch(Exception e){
e.printStackTrace();
}
}
Você tem que reescrever o arquivo todo, e depois escrever a nova linha no final.
Como assim reescrever o arquivo todo? Você esta falando do txt?
Pq ele adiciona a linha digitada pelo usuario e chama esse método…
VIsh, eu li só seu ultimo post e interpretei algo completamente diferente. Ignora o que falei. :lol:
Tudo bem, mas vc tem alguma idéia de como eu posso fazer isso?
Putz, acabei de ver que ele so funciona para um usuário…
Tipo o usuário so ve o q ele digitou…
Alguem pode me ajudar ?
Caramba, não consigo fazer isso funcionar…
Gente, consegui fazer funcionar o chat aqui…
So que eu queria que desse para enviar reservadamente para um cliente, quando digitasse
>>nomeCliente
MAs, não sei como eu posso ter esse controle, se puderem me ajudar…
PS: Se quiserem, posto o código desenvolvido até agora…
Gente, consegui fazer funcionar o chat aqui…So que eu queria que desse para enviar reservadamente para um cliente, quando digitasse
>>nomeCliente
MAs, não sei como eu posso ter esse controle, se puderem me ajudar…
PS: Se quiserem, posto o código desenvolvido até agora…
Também devo implementar isso no meu sistema que tem chat. Só que devo usar banco de dados. Conseguiu resolver os outros problemas? Qual problema você está exatamente agora? Se quiser ajuda mesmo pode postar todo o código aqui vai ver alguém consegue te ajudar.
import java.awt.BorderLayout;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.concurrent.ThreadFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.text.html.HTMLDocument.Iterator;
public class Servidor{
JLabel lblNome;
String string = "";
InputStreamReader stream;
ArrayList clienteOutPutSteams, cliente;
ServerSocket servidor;
public void go(JFrame f){
clienteOutPutSteams = new ArrayList();
cliente = new ArrayList();
try{
servidor = new ServerSocket(4242);
while(true){
Socket sock = servidor.accept();
PrintWriter write = new PrintWriter(sock.getOutputStream());
clienteOutPutSteams.add(write);
InputStreamReader isReader = new InputStreamReader(sock.getInputStream());
BufferedReader read = new BufferedReader(isReader);
cliente.add(read.readLine());
System.out.println(cliente);
Thread t = new Thread(new ClienteHandler(sock));
t.start();
System.out.println("Conectado...");
}
}
catch(Exception e){
e.printStackTrace();
}
}
public Servidor(){
JFrame frm = new JFrame();
frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frm.setSize(160, 160);
frm.setVisible(true);
frm.setLocationRelativeTo(null);
frm.setResizable(false);
lblNome = new JLabel("Conexão estabelecida ...");
frm.getContentPane().add(lblNome);
go(frm);
}
public static void main(String [] args){
new Servidor();
}
public class ClienteHandler implements Runnable{
BufferedReader reader;
Socket socket;
public ClienteHandler(Socket sock) {
try {
socket = sock;
InputStreamReader isReader = new InputStreamReader(socket.getInputStream());
reader = new BufferedReader(isReader);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void run() {
try {
String texto = " ";
while((texto = reader.readLine()) != null){
File file = new File("ArquivoJava.txt");
FileWriter f = new FileWriter(file,true);
FileWriter fos = new FileWriter("ArquivoJava.txt",true); // Perceba que estamos instanciando uma classe aqui. A FileOutputStream. Pesquise sobre ela!
fos.write(texto);
fos.write("\n");
fos.close();
f.close();
falarTodos(texto);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void falarTodos(String msg){
try {
@SuppressWarnings("rawtypes")
java.util.Iterator it = clienteOutPutSteams.iterator();
while (it.hasNext()) {
try{
PrintWriter write = (PrintWriter) it.next();
write.println(msg);
write.flush();
}
catch(Exception e){
e.printStackTrace();
}
}
}
catch(Exception e){
e.printStackTrace();
}
}
}
}
import java.awt.Container;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.JButton;
import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.ScrollPaneConstants;
public class Cliente extends JFrame{
JTextArea txtEnviar;
Socket socket;
PrintWriter saida;
BufferedReader reader;
JTextArea incoming;
JTextField txtNome;
GridBagConstraints cons = new GridBagConstraints();
int i = 0;
public Cliente(){
super("Chat Cliente");
setUpNetworking();
Container janela = this.getContentPane();
janela.setLayout(new GridBagLayout());
cons.gridx = 0;
cons.gridy = 0;
cons.fill = GridBagConstraints.BOTH;
cons.anchor = GridBagConstraints.WEST;
txtNome = new JTextField();
txtNome.setPreferredSize(new Dimension(80,20));
janela.add(txtNome,cons);
cons.gridx = 0;
cons.gridy = 1;
cons.gridwidth = 6;
cons.gridheight = 3;
cons.weightx = 1;
cons.weighty = 1;
incoming = new JTextArea(12,50);
incoming.setLineWrap(true);
incoming.setWrapStyleWord(true);
incoming.setEditable(false);
JScrollPane scroll = new JScrollPane(incoming);
scroll.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
scroll.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
scroll.setPreferredSize(new Dimension(400,200));
scroll.setMinimumSize(new Dimension(200,80));
janela.add(scroll,cons);
cons.fill = GridBagConstraints.BOTH;
cons.gridx = 0;
cons.gridy = 5;
cons.gridwidth = 1;
cons.gridheight = 2;
cons.weightx = 0.7;
cons.weighty = 0.7;
txtEnviar = new JTextArea(1,20);
txtEnviar.setLineWrap(true);
txtEnviar.setWrapStyleWord(true);
JScrollPane scrollEnvia = new JScrollPane(txtEnviar);
scrollEnvia.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
scrollEnvia.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
scrollEnvia.setPreferredSize(new Dimension(200,60));
scrollEnvia.setMinimumSize(new Dimension(100,30));
janela.add(scrollEnvia,cons);
cons.gridx = 3;
cons.gridy = 5;
cons.gridheight = 1;
cons.weightx = 0.3;
cons.weighty = 0;
JButton btn = new JButton("Enviar");
btn.addActionListener(new Enviar());
janela.add(btn,cons);
Thread thread = new Thread(new IncomingReader());
thread.start();
this.addWindowListener(new Janela());
}
public void setUpNetworking(){
try {
socket = new Socket("127.0.0.1", 4242);
InputStreamReader streamReader = new InputStreamReader(socket.getInputStream());
reader = new BufferedReader(streamReader);
saida = new PrintWriter(socket.getOutputStream());
System.out.println("Conexão estabelecida...");
} catch (UnknownHostException e1) {
e1.printStackTrace();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
public static void main(String [] args){
Cliente cli = new Cliente();
cli.setSize(400,300);
cli.setLocationRelativeTo(null);
//cli.setResizable(false);
cli.setState(JFrame.MAXIMIZED_BOTH);
cli.setVisible(true);
cli.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
class IncomingReader implements Runnable{
@Override
public void run() {
try {
String msg = "";
while (msg != null){
msg = reader.readLine();
incoming.append(msg+"\n");
}
}
catch (IOException e) {
// caso ocorra alguma exceção de E/S, mostra qual foi.
System.out.println("Ocorreu uma Falha... .. ." + " IOException: " + e);
}
}
}
class Enviar implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
if(txtNome.getText().trim().length() <= 2){
JOptionPane.showMessageDialog(null, "O seu nome não pode ficar em branco");
}
else{
txtNome.setEnabled(false);
if(txtNome.getText().trim().length() >= 2 && i == 0){
saida.println(txtNome.getText());
saida.flush();
i++;
}
else{
if(txtEnviar.getText().trim().length() >= 1){
try{
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy kk:mm:ss");
saida.println(txtNome.getText()+" escreveu: "+txtEnviar.getText() +"\n " +
"em "+sdf.format(new Date())+"\n");
saida.flush();
}
catch(Exception e1){
e1.printStackTrace();
}
txtEnviar.setText("");
txtEnviar.requestFocus();
}
}
}
}
}
class Janela implements WindowListener{
@Override
public void windowOpened(WindowEvent paramWindowEvent) {
// TODO Auto-generated method stub
}
@Override
public void windowClosing(WindowEvent paramWindowEvent) {
}
@Override
public void windowClosed(WindowEvent paramWindowEvent) {
// TODO Auto-generated method stub
}
@Override
public void windowIconified(WindowEvent paramWindowEvent) {
// TODO Auto-generated method stub
}
@Override
public void windowDeiconified(WindowEvent paramWindowEvent) {
// TODO Auto-generated method stub
}
@Override
public void windowActivated(WindowEvent paramWindowEvent) {
// TODO Auto-generated method stub
}
@Override
public void windowDeactivated(WindowEvent paramWindowEvent) {
// TODO Auto-generated method stub
}
}
}
Agora tenta explicar o seu problema de maneira clara.
É o seguinte: o sistema ai ta funcionando normalmente, ele envia as mensagens para todos os usuários logados e, o texto, e gravado em
um bloco de notas…
O problema e:
Gostaria que um usuário pudesse enviar uma mensagem reservadamente para um outro usuario, usando o esquema
>>nomeUsuario
o problema é que para isso, teria que ter um controle de quem esta logado e como enviar a mensagem so para os dois visualizarem…
É o seguinte: o sistema ai ta funcionando normalmente, ele envia as mensagens para todos os usuários logados e, o texto, e gravado emum bloco de notas…
O problema e:
Gostaria que um usuário pudesse enviar uma mensagem reservadamente para um outro usuario, usando o esquema
>>nomeUsuario
o problema é que para isso, teria que ter um controle de quem esta logado e como enviar a mensagem so para os dois visualizarem…
Bom. Vamos primeiro para a teoria depois para a prática. O que você pode fazer é colocar uma tela que exibe os nomes dos usuários(clientes) conectados. E um botão ou uma “coisa” qualquer que tenha um evento de que quando você clicar nesse usuário, ele usa o ip desse usuario e manda para o servidor e o servidor usa para enviar mensagens somente para esse usuário. Ai o que voce tem que fazer na inicialiação é pedir um nome na hora de conectar. Obter um ip desse cliente e armazenar. E depois fazer o que eu falei antes.
Eu tenho um ArrayList com o nome de todos os usuários no servidor…
Como eu posso implementar isso para que escreva o nome de todos os usuários em uma lista no meu form do
cliente assim que ele criar uma conexão e atualizar sempre que alguem se logar…
Nesse caso pode ser feito um tratamento direto nas mensagens enviadas e recebidas, utilizando o início da mensagem como informações ocultas.
ex:
HashSet<String> usuarios = new HashSet<String>;
...
String entra = entrada.readLine();
if (entra.startsWith("NICKENTRA")) {
usuarios.add(entra.substring(9));
} else if (entra.startsWith("MSG")) {
textField.append(entra.substring(4));
}
Faça um tratamento pra entrada de usuário, saída do usuário assim você terá sempre todos os clientes com lista atualizada de usuários…
HashSet usei para nao ter usuários com mesmo nick, o que poderia fazer também é no servidor fazer um tratamento sincronizado para recepção e também autenticação do nick, não permitindo dois usuários com um mesmo nick.
não sei se é a melhor prática, mas talvez possa resolver seu problema…
Abraços.
Bom. Vamos primeiro para a teoria depois para a prática. O que você pode fazer é colocar uma tela que exibe os nomes dos usuários(clientes) conectados. E um botão ou uma “coisa” qualquer que tenha um evento de que quando você clicar nesse usuário, ele usa o ip desse usuario e manda para o servidor e o servidor usa para enviar mensagens somente para esse usuário. Ai o que voce tem que fazer na inicialiação é pedir um nome na hora de conectar. Obter um ip desse cliente e armazenar. E depois fazer o que eu falei antes.
pq “o ip do cliente”?
imagine se tiver 10 apps por traz de um NAT conectados a esse servidor. vc vai ter 10 “clientes” com mesmo IP.
o nick não era pra indentificar? então! use ele!!!
linha 44 da sua listagem:
cliente.add(read.readLine());
se o cara conectar e não enviar nada, seu server fica travado a espera de LineBreak.
não seria melhor ele fazer isso ja em outra thread?
pelo menos olhando parece ser isso, não cheguei a testar aki. se eu estiver errado me perdoe.
Bom. Vamos primeiro para a teoria depois para a prática. O que você pode fazer é colocar uma tela que exibe os nomes dos usuários(clientes) conectados. E um botão ou uma “coisa” qualquer que tenha um evento de que quando você clicar nesse usuário, ele usa o ip desse usuario e manda para o servidor e o servidor usa para enviar mensagens somente para esse usuário. Ai o que voce tem que fazer na inicialiação é pedir um nome na hora de conectar. Obter um ip desse cliente e armazenar. E depois fazer o que eu falei antes.pq “o ip do cliente”?
imagine se tiver 10 apps por traz de um NAT conectados a esse servidor. vc vai ter 10 “clientes” com mesmo IP.
o nick não era pra indentificar? então! use ele!!!
O nick é para identificar o usuário mas o servidor não usa o nick para enviar mensagens e sim endereço.
Bom. Vamos primeiro para a teoria depois para a prática. O que você pode fazer é colocar uma tela que exibe os nomes dos usuários(clientes) conectados. E um botão ou uma “coisa” qualquer que tenha um evento de que quando você clicar nesse usuário, ele usa o ip desse usuario e manda para o servidor e o servidor usa para enviar mensagens somente para esse usuário. Ai o que voce tem que fazer na inicialiação é pedir um nome na hora de conectar. Obter um ip desse cliente e armazenar. E depois fazer o que eu falei antes.pq “o ip do cliente”?
imagine se tiver 10 apps por traz de um NAT conectados a esse servidor. vc vai ter 10 “clientes” com mesmo IP.
o nick não era pra indentificar? então! use ele!!!
O nick é para identificar o usuário mas o servidor não usa o nick para enviar mensagens e sim endereço.
como assim?
vc quer dizer q usa o IP?
se tiver 20 com mesmo IP?
lembre-se q o q se conecta são Apps e não PCs.
Bem lembrado GilsonNunes. Viajei agora.
ViniGodoy em tópico tirando uma dúvida igual a sua digitou isso:
fonte: http://www.guj.com.br/java/74218-chat-em-java--usando-socket-e-thread/3