Problemas ao enviar mensagens ao Servidor Socket

2 respostas
Ricardo_Neves

Tenho uma interface grafica com um botao, que ao clicar nele ele inicia meu servidor de socket, no qual segue o codigo abaixo.

SRV.java

import java.io.BufferedReader;
import java.io.DataInputStream;
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.Enumeration;
import java.util.Vector;

import javax.swing.JTextArea;

public class SRV extends Thread
{
	private int porta;
	private ServerSocket srvsocket;
	private ConexaoSecundaria csec;
	private JTextArea areaDialogo = null;
	protected static Vector usuarios = new Vector();
	protected static String nomeUsuario;

	public SRV(int porta, JTextArea areaDialogo)
	{
		this.porta = porta;
		this.areaDialogo = areaDialogo;
	}

	public void run()
	{
		try
		{
			srvsocket = new ServerSocket(porta);
		}
		catch (IOException e) {	System.err.println(e);  }

		while (true)
		{
			try
			{
				areaDialogo.append("Esperando alguem se conectar...\n");
				Socket clientsocket = srvsocket.accept();
				areaDialogo.append("Conectou...\n");
				csec = new ConexaoSecundaria(clientsocket, areaDialogo);
				new Thread(csec).start();
			}
			catch(Exception e) { System.err.println(e); }
		}
	}
}

class ConexaoSecundaria implements Runnable
{
	static Socket clientsocket;
	static PrintStream saida;
	static JTextArea areaDialogo;

	public ConexaoSecundaria(Socket clientsocket, JTextArea areaDialogo)
	{
		this.clientsocket = clientsocket;
		this.areaDialogo = areaDialogo;
	}

	public void run() {
		try {
			   BufferedReader entrada = new BufferedReader(new InputStreamReader(clientsocket.getInputStream()));
			   PrintStream saida = new PrintStream(clientsocket.getOutputStream());
			   
			   SRV.nomeUsuario = entrada.readLine();
			   
			   areaDialogo.append(SRV.nomeUsuario+"\n");
			   
			   
			   
			   SRV.usuarios.add(saida);
			   
			   String linha = entrada.readLine();
			   areaDialogo.setText(areaDialogo.getText()+"Linha "+ linha);			   
			   
			   while (linha != null && !(linha.trim().equals(""))) 
			   {
				   areaDialogo.setText(areaDialogo.getText()+SRV.nomeUsuario+"\n");
				   
			   
			    enviaMensagens(saida, " disse: ", linha+"\n");
			    
			    linha = entrada.readLine();
			   }
			   
			  
			   SRV.usuarios.remove(saida);
			   clientsocket.close();
			  }
		  catch (IOException e) {
		  
		   System.out.println("IOException: " + e);
		  }
		 }
	
	
			
			
			
	
	public void enviaMensagens(PrintStream saida, String acao, String linha)
	{
			  
			  areaDialogo.append("Teste entrou"+SRV.usuarios.size());
			  
			   for(int i=0; i < SRV.usuarios.size(); i++) 
			  {
			    PrintStream chat = (PrintStream) SRV.usuarios.get(i);
			    			  			  
			   if (chat != saida) 
			   {
				   chat.println(SRV.nomeUsuario + acao + "falou"+"\n");
			   }
			  }
			 }

	
}

Estou tentando fazer com que envie a todos os clientes, mas nao ta dando certo, assim como o cliente as vezes nao consegue enviar para o servidor, que tambem eh iniciado por um botao no JFrame, e possui ainda outro botao q envia a mensagem digitada para o servidor repassar a todos, o que tambem nao funciona, nao aonde estou fazendo errado.

ClienteDeChat.java

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;

import javax.swing.JOptionPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class ClienteDeChat extends Thread {
 
	private static JTextArea areaDialogo;
	
	private static JTextField msg;
	private static PrintStream saida;
	private static boolean done = false;
	private static Socket conexao;
	private static BufferedReader entrada;
	private static String meuNome;
 
 public ClienteDeChat(JTextArea areaDialogo, JTextField msg)
 {
	this.areaDialogo = areaDialogo;	 
	this.msg = msg;
 }
 
 public void envia() 
 {
	 
	 try {
		   BufferedReader entrada=new BufferedReader(new InputStreamReader(conexao.getInputStream()));
		   
		   areaDialogo.append("entrou ");
		   String linha="t";
		   
		   saida.println(meuNome+"diz: "+msg.getText());
		   
		   {
		   
		    linha = entrada.readLine();
		    
		    System.out.println(linha);
		    System.out.print("...> ");
		   }
		  }
		  catch (IOException e) {
		  
			 
			  e.printStackTrace();
		  }
		 
		  done = true;
		 }
 
 
 public void run() {
  try {
   
   conexao = new Socket("localhost", 4321);
     
   saida = new PrintStream(conexao.getOutputStream());
   
   entrada = new BufferedReader(new InputStreamReader(conexao.getInputStream()));
  
   meuNome = JOptionPane.showInputDialog(null, "Entre com o seu nome: ");
      
   saida.println(meuNome+"   >>>>>>>>>> Acabou de Entrar !!!");   
      
   String linha = "Teste Drive";
   
 
	    System.out.print(">== ");
	    linha = msg.getText();
	   
	    saida.println(linha);
	  

  }
  catch (IOException e) {
   
   
   e.printStackTrace();
  }
 }
}

Se que ja deve ta bem batido esse assunto aqui, mas ainda nao consegui fazer o meu funcionar certinho, se alguem tiver uma sugestao do que fazer para funcionar corretamente, posta ae ok.

Valeus

2 Respostas

Grinvon

Eu fiz um chat multithread em Java com sockets, posso tentar procurar o código fonte em casa e ver isso contigo, ok?

Fui!

Ricardo_Neves

Ok, agradeco a ajuda amigo.

falows

Criado 21 de junho de 2007
Ultima resposta 21 de jun. de 2007
Respostas 2
Participantes 2