Galera é o seguinte. Tenho um chat de mensagens ,com a classe servidor ,gerenciador de clientes e o cliente. No servidor tenho os System.out.println porém quero que em vez de sair tudo no console saia no Jtextarea .Começei a implementar aqui mas não está funcionando .
import java.awt.Color;
import java.awt.Font;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
public class ServidorSocket {
public static void main(String[] args) throws IOException {
ServerSocket servidor = null;
try {
JOptionPane.showMessageDialog(null, "startando o servidor");
System.out.println("Startando o servidor");
String portacliaq = null;
portacliaq = JOptionPane.showInputDialog("Qual a porta para o servidor do Chat ?");
servidor = new ServerSocket(Integer.parseInt(portacliaq)); //aqui vai fica porta !! para conectar use ip:porta
System.out.println("servidor startado");
JOptionPane.showMessageDialog(null, "Servidor DE ARQUIVO startado / Na porta "+portacliaq);
JOptionPane.showMessageDialog(null, "Aguardando conexão de clientes na mesma porta do servidor !");
while(true){
Socket cliente = servidor.accept();
//
//
new GerenciadorDeClientes(cliente);
JTextArea textArea = new JTextArea ( 50 , 10 );
JTextArea jtQui = null;
PrintStream PrintStream = new PrintStream ( new CustomOutputStream (jtQui));
System.setOut (PrintStream);
System.setErr (PrintStream);
}
} catch (IOException e) {
try {
if(servidor != null)
servidor.close();
} catch (IOException e1) {}
JOptionPane.showMessageDialog(null, "A porta está ocupada ou servidor foi fechado");
System.err.println("a porta está ocupada ou servidor foi fechado");
e.printStackTrace();
}
}
}
Assim
Digamos que sua mensagem ficou armazenada na String info;
System.out.println(info);
seuTextArea.setText(info);
Amigo então…a informação que eu quero exibir está na classe GerenciadorDeClientes.
Como faz para exportar de lá e exibir na classe servidor?Sendo que essa classe faz parte do mesmo src.
Classe GerenciadorDeClientes
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.net.Socket;
import java.util.HashMap;
import java.util.Map;
import javax.swing.JOptionPane;
import javax.swing.JTextArea;
public class GerenciadorDeClientes extends Thread {
private Socket cliente;
private String nomeCliente;
private BufferedReader leitor;
private PrintWriter escritor;
private static final Map<String,GerenciadorDeClientes> clientes = new HashMap<String,GerenciadorDeClientes>();
public JTextArea jtQui;
public GerenciadorDeClientes(Socket cliente) {
this.cliente = cliente;
start();
}
@Override
public void run() {
try {
leitor = new BufferedReader(new InputStreamReader(cliente.getInputStream()));
escritor = new PrintWriter(cliente.getOutputStream(), true);
efetuarLogin();
String msg;
while(true){
msg = leitor.readLine();
if(msg.equalsIgnoreCase(Comandos.SAIR)){
this.cliente.close();
}else if(msg.startsWith(Comandos.MENSAGEM)){
String nomeDestinario = msg.substring(Comandos.MENSAGEM.length(), msg.length());
//colocar essa linha sequinte em um textarea
System.out.println("enviando para " + nomeDestinario);
GerenciadorDeClientes destinario = clientes.get(nomeDestinario);
//colocar aqui um negocio para enviar arquivo
//
if(destinario == null){
escritor.println("O cliente informado nao existe");
}else{
// escritor.println("digite uma mensagem para " + destinario.getNomeCliente());
destinario.getEscritor().println(this.nomeCliente + " disse: " + leitor.readLine());
}
// lista o nome de todos os clientes logados
}else if(msg.equals(Comandos.LISTA_USUARIOS)){
atualizarListaUsuarios(this);
}else{
escritor.println(this.nomeCliente + ", você disse: " + msg);
}
}
} catch (IOException e) {
// coloca em umtextarea tbm
System.err.println("o cliente fechou a conexao");
clientes.remove(this.nomeCliente);
}
}
private synchronized void efetuarLogin() throws IOException {
while(true){
escritor.println(Comandos.LOGIN);
this.nomeCliente = leitor.readLine().toLowerCase().replaceAll(",", "");
if(this.nomeCliente.equalsIgnoreCase("null") || this.nomeCliente.isEmpty()){
escritor.println(Comandos.LOGIN_NEGADO);
}else if(clientes.containsKey(this.nomeCliente)){
escritor.println(Comandos.LOGIN_NEGADO);
}else{
escritor.println(Comandos.LOGIN_ACEITO);
escritor.println("Olá " + this.nomeCliente);
clientes.put(this.nomeCliente, this);
for(String cliente: clientes.keySet()){
atualizarListaUsuarios(clientes.get(cliente));
}
break;
}
}
}
private void atualizarListaUsuarios(GerenciadorDeClientes cliente) {
StringBuffer str = new StringBuffer();
for(String c: clientes.keySet()){
if(cliente.getNomeCliente().equals(c))
continue;
str.append(c);
str.append(",");
}
if(str.length() > 0)
str.delete(str.length()-1, str.length());
cliente.getEscritor().println(Comandos.LISTA_USUARIOS);
cliente.getEscritor().println(str.toString());
}
public PrintWriter getEscritor() {
return escritor;
}
public String getNomeCliente() {
return nomeCliente;
}
// public BufferedReader getLeitor() {
// return leitor;
// }
}
Cara, faz assim
- Instancia tua classe que tem o componente TextArea dentro da Classe que tem essa mensagem aparecendo, no caso, GerenciadorDeClientes. Ex:
Classe1
static JTextArea tArea = new JTextArea();
//Aqui sua outra classe GerenciadorDeClientes
Classe GerenciadorDeClientes
Classe1 classe1 = new Classe1();
- Usa tua instancia pra acessar os metodos do componente e setar o texto. Creio que para isso, ele deva ser static, como coloquei…
classe1.tArea.setText(suaStringComSuaMensagem);
Guimagal, está funcionando como está escrito? Você consegue ver a lista de usuarios, enviar mensagens mesmo pelo System.out.print?
Não amigo,no caso eu vejo pela classe cliente tudo isso já dentro de um frame,ou seja,dentro da telinha que eu fiz.Posso postar aqui se vc quiser ver.
Só na classe servidor que eu tenho como ver pelo console isso
System.out.println("enviando para " + nomeDestinario);
e
System.err.println(“o cliente fechou a conexao”);
Quero que isso vá para um jtextarea em vez de ficar no console.
Amigo fiz o que vc me disse e não deu certo
Vou colocar a classe como ficou.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.net.Socket;
import java.util.HashMap;
import java.util.Map;
import javax.swing.JOptionPane;
import javax.swing.JTextArea;
public class GerenciadorDeClientes extends Thread {
private Socket cliente;
private String nomeCliente;
private BufferedReader leitor;
private PrintWriter escritor;
private static final Map<String,GerenciadorDeClientes> clientes = new HashMap<String,GerenciadorDeClientes>();
public JTextArea jtQui;
public GerenciadorDeClientes(Socket cliente) {
this.cliente = cliente;
start();
}
static JTextArea tArea = new JTextArea();
GerenciadorDeClientes classe1 = new GerenciadorDeClientes(cliente);
classe1.tArea.setText(suaStringComSuaMensagem);
public void run() {
try {
leitor = new BufferedReader(new InputStreamReader(cliente.getInputStream()));
escritor = new PrintWriter(cliente.getOutputStream(), true);
efetuarLogin();
String msg;
while(true){
msg = leitor.readLine();
if(msg.equalsIgnoreCase(Comandos.SAIR)){
this.cliente.close();
}else if(msg.startsWith(Comandos.MENSAGEM)){
String nomeDestinario = msg.substring(Comandos.MENSAGEM.length(), msg.length());
//colocar essa linha sequinte em um textarea
System.out.println("enviando para " + nomeDestinario);
GerenciadorDeClientes destinario = clientes.get(nomeDestinario);
//colocar aqui um negocio para enviar arquivo
//
if(destinario == null){
escritor.println("O cliente informado nao existe");
}else{
// escritor.println("digite uma mensagem para " + destinario.getNomeCliente());
destinario.getEscritor().println(this.nomeCliente + " disse: " + leitor.readLine());
}
// lista o nome de todos os clientes logados
}else if(msg.equals(Comandos.LISTA_USUARIOS)){
atualizarListaUsuarios(this);
}else{
escritor.println(this.nomeCliente + ", você disse: " + msg);
}
}
} catch (IOException e) {
// coloca em umtextarea tbm
System.err.println("o cliente fechou a conexao");
clientes.remove(this.nomeCliente);
}
}
private synchronized void efetuarLogin() throws IOException {
while(true){
escritor.println(Comandos.LOGIN);
this.nomeCliente = leitor.readLine().toLowerCase().replaceAll(",", "");
if(this.nomeCliente.equalsIgnoreCase("null") || this.nomeCliente.isEmpty()){
escritor.println(Comandos.LOGIN_NEGADO);
}else if(clientes.containsKey(this.nomeCliente)){
escritor.println(Comandos.LOGIN_NEGADO);
}else{
escritor.println(Comandos.LOGIN_ACEITO);
escritor.println("Olá " + this.nomeCliente);
clientes.put(this.nomeCliente, this);
for(String cliente: clientes.keySet()){
atualizarListaUsuarios(clientes.get(cliente));
}
break;
}
}
}
private void atualizarListaUsuarios(GerenciadorDeClientes cliente) {
StringBuffer str = new StringBuffer();
for(String c: clientes.keySet()){
if(cliente.getNomeCliente().equals(c))
continue;
str.append(c);
str.append(",");
}
if(str.length() > 0)
str.delete(str.length()-1, str.length());
cliente.getEscritor().println(Comandos.LISTA_USUARIOS);
cliente.getEscritor().println(str.toString());
}
public PrintWriter getEscritor() {
return escritor;
}
public String getNomeCliente() {
return nomeCliente;
}
// public BufferedReader getLeitor() {
// return leitor;
// }
}
Por exemplo como faz para mim abrir esse jtexarea na classe do servidor ?
Olha o comentário que eu deixei nesse código
import java.awt.Color;
import java.awt.Font;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
public class ServidorSocket {
public static void main(String[] args) throws IOException {
ServerSocket servidor = null;
try {
JOptionPane.showMessageDialog(null, "startando o servidor");
System.out.println("Startando o servidor");
String portacliaq = null;
portacliaq = JOptionPane.showInputDialog("Qual a porta para o servidor do Chat ?");
servidor = new ServerSocket(Integer.parseInt(portacliaq)); //aqui vai fica porta !! para conectar use ip:porta
System.out.println("servidor startado");
JOptionPane.showMessageDialog(null, "Servidor DE MSG startado / Na porta "+portacliaq);
JOptionPane.showMessageDialog(null, "Aguardando conexão de clientes na mesma porta do servidor !");
while(true){
Socket cliente = servidor.accept();
//
//
new GerenciadorDeClientes(cliente);
// Os System println estão dentro da classe Gerenciador de clientes e são exibidos no console dessa classe.
}
} catch (IOException e) {
try {
if(servidor != null)
servidor.close();
} catch (IOException e1) {}
JOptionPane.showMessageDialog(null, "A porta está ocupada ou servidor foi fechado");
System.err.println("a porta está ocupada ou servidor foi fechado");
e.printStackTrace();
}
}
}
Envie seu projeto para esse email: jonas.barros.etb@gmail.com, vou tentar fazer pra voce
1 curtida