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