Chat em java usando Socket e Thread

É a “vazão” que vc consegue imprimir num canal…
No caso, a taxa de transferência máxima.

ola deonde é este:

 ExecutorService requisitionPool = Executors.newFixedThreadPool(50);

como ele funciona?
como é este esquema de pool de threads?

Entendi, valeu pela explicação.
No meu caso os dados são pequenos são apenas alguns parâmetros na url.

Vai no site http://java.sun.com/javase/6/docs/api/ e entra no pacote java.util.concurrent, lá vai ter tudo o que você precisa para criar um pool de threads.

Mais uma coisa este SocketChannel ele cria um pool? ou Eu tenho que fazer várias threads com um SocketChannel? Ou seria um tipo de “gerenciador de conexões”?

Não, com os selectors você não precisaria criar várias threads.
Eles permitam que você saiba exatamente quando há dados em cada canal de comunicação, e então a thread pode fazer a leitura sem bloquear.

Eu ainda acho que o problema não é a classe Socket.
E há altas chances de você está gastando seu tempo e esforço no local errado…

Ola sabe onde tenha algum exemplo de chat com java???
e um sistema de um jogo online?
neste caso alem do servidor o cliente teria varias threads dos outros jogadores tbm não e?
sabe onde tenha um material um exemplo ou algo referente a estas coisas?

Por sinal, tenho. Eu fiz recentemente para os meus alunos de fundamentos.

Aqui tem um exemplo de um chat mega-super-ultra-duper simples em TCP e um não tão simples assim em UDP.
No caso do UDP, tem também um aplicativo que é um pequeno túnel, que te permite inserir erros comuns, tal como atrasos, jitter, erros, etc.

A idéia do tunel é poder simular condições ruins de rede, comuns no caso de jogos. O TCP é uma péssima opção para os jogos porque ele intensifica o lag da rede, já que faz retransmissão.

Estou fazendo um pong multiplayer para a pós. Assim que eu terminar, eu publico no meu site.

valeu… o sobre as portas quais devem ser usadas para um chat?

Quais você quiser. O ideal é não usar uma das Well Known Ports.

Eu geralmente uso 15980, já que 15/09/80 é a data do meu nascimento. :smiley:

no simplechat to tentando conectar mas não obtive sucesso ele fica travado no “Aguardando conexao…”
no

Socket s = socket.accept();

qdo tento iniciar o servidor…

Sim… vc então deve abrir outro chat e conectar nele.

Use, por exemplo, os parâmetros
-server 15980
(abre o server na porta 15980)

Rode de novo e:
-client 127.0.0.1 15980
(conecta o client nesse server).

[quote=ViniGodoy]Algumas dicas:

  1. O cliente não terá mais de uma thread. Só o server.
  2. O servidor terá 1 thread para esperar os clientes (método accept) e uma thread para cada cliente criado;
  3. Cada cliente que for criado deve ser colocado num List. Assim, quando uma mensagem chegar, você pode redistribuir para os outros clientes;
  4. Não utilize o ObjectOutputStream, no lugar, pense no DataOuputStream. Por lá tem um método readUTF, que deve ser mais fácil de usar no seu caso.[/quote]

Mano, mto boa dica!!

Vai ser mto util…

TkssS

[quote=ViniGodoy]Algumas dicas:

  1. O cliente não terá mais de uma thread. Só o server.
  2. O servidor terá 1 thread para esperar os clientes (método accept) e uma thread para cada cliente criado;
  3. Cada cliente que for criado deve ser colocado num List. Assim, quando uma mensagem chegar, você pode redistribuir para os outros clientes;
  4. Não utilize o ObjectOutputStream, no lugar, pense no DataOuputStream. Por lá tem um método readUTF, que deve ser mais fácil de usar no seu caso.[/quote]

Andei lendo varios e varios topicos mais acabei num achando. Estou fazendo um trabalho pa facul igual a esse, utilizei a dica de topico pra fazer, mais depois acabei achando um erro. Crio a thread pro novo client, ele muda as portas e tals, até ai ta blz, qdo o client envia uma msg as info criada qdo ele conectou não estão disponiveis. Tipo criei 4 vetores, users, ips, ports, salas qdo vou acessar esses dados eles estão apenas na primeira thread. Tem como eu acessar esses dados? Caso num fui claro postem oke não entenderam.

Obrigado pela atenção.

Desculpem a resurreição do tópico.

Vini, você por acaso terminou o Pong?

Por acaso, eu fiz um pra disciplina de Sistemas Distribuídos na faculdade, mas não implementei toda a lógica do jogo porque tive pouco tempo. O professor aceitou assim mesmo, uma vez que a parte de rede está 100% funcional.

Segue em anexo o arquivo do projeto, bastando descompactar e abrir no Eclipse.

EDIT - nossa… essa versão do fonte tá sem nenhum comentário… Vou procurar a versão mais recente e depois substituo esse anexo.

Terminei sim. O servidor suporta 3 jogos de Pong simultâneos. Trabalhei com UDP.

Mas não gostei do resultado. O Pong é o pior caso possível para um jogo em rede. Tentei implementar Dead Reckoning, mas o jogo é deterministico demais e exige uma resposta imediata demais para que possamos disfarçar o lag de rede.

[quote=marceloplis]Veja se isso te ajuda:

http://www.guj.com.br/java.tutorial.artigo.20.1.guj[/quote]

Gostei deste tutorial! Só que lá diz que dá pra baixar os arquivos fontes mas eu não achei o link!! Será que estou cego?? :cry:

Olá será que alguém poderia me ajudar estou criando um chat onde o usuario pode escolher se vai mandar a mensagem para todos os usuarios ou uma mensagem privada para apenas um usuário, se ele escolher apenas um é aberta uma nova janela para digitar sua mensagem mais não estou conseguindo fazer esse mensagem chegar apenas para o determinado destinatário ela está indo para todos.
Alguém sabe o que posso fazer
Obrigado

meu email para contato é :
cygnus.tks@hotmail.com

Há duas formas de fazer isso:

  1. A mais eficiente e segura, porém mais difícil: É usar uma forma de endereçamento que o servidor reconheça. Por exemplo, o nome da pessoa ou o endereço da máquina, ou ainda algum ID negociado. Acho que eu usaria a última forma. Então, adicione ao seu protocolo o ID de quem deve receber a mensagem e faça com que o servidor só envie a mensagem para essa pessoa. Uma forma fácil de se obter isso é ter no servidor um mapa, que liga o id ao Socket que tem aquele id.

  2. A forma menos eficiente, menos segura, porém mais fácil. Adicione um identificador na mensagem e faça com que o cliente que recebe as mensagens simplesmente ignore mensagens sem aquele identificador. É menos eficiente pois o servidor ainda irá repassar mensagens para clientes que não irão lê-las, o que é um desperdício de banda. E é mais insegura pois alguém mal intencionado poderia criar um cliente capaz de ler mensagens privadas dos outros, já que elas efetivamente chegam.

Boa tarde Galera !!! o meu chat ta mandando mensagem pra todos,mas eu precisava mandar pra somente um destinatario tambem, gostaria de saber como faço isso,se alguem puder me ajudar desde ja grato pela força flw galera abraço t+.segue abaixo o código.

[quote=cassiojoselito]Boa tarde Galera !!! o meu chat ta mandando mensagem pra todos,mas eu precisava mandar pra somente um destinatario tambem, gostaria de saber como faço isso,se alguem puder me ajudar desde ja grato pela força flw galera abraço t+.segue abaixo o código.

[code]
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Servidor {

public static void main(String [] args) throws IOException {
           
	 //inicia o servidor
	 
	 new Servidor(12345).executa();
 }
 
 private int porta;
 private boolean encerrar;
 
 private List<PrintStream> clientes;
 
 public Servidor (int porta) {
	 this.porta = porta;
	 this.clientes = new ArrayList<PrintStream>();
 }
 public void executa () throws IOException {
	 
	 ServerSocket servidor = new ServerSocket(this.porta);
	 
	 System.out.println("Porta 12345 aberta!");
	 
	 while (!encerrar){
		 
		 //aceita um cliente
		 
		 Socket cliente = servidor.accept();
		 System.out.println("Nova conexao com o cliente" +
				 cliente.getInetAddress().getHostAddress());
		 
		 //adiciona saida do cliente à lista
		 
		 PrintStream ps = new PrintStream(cliente.getOutputStream());
		 this.clientes.add(ps);
		 
		 //cria tratador de cliente numa nova tread
		 
		 TrataCliente tc = new TrataCliente(cliente.getInputStream(),this);
		 new Thread(tc).start();}
	 
	 }
 public void distribuiMensagem(String msg) {
	
	 // envia msg para um só destinatario
	 
	 for (PrintStream cliente : this.clientes) 
	 cliente.println(msg);
	 
 }
	 
 public class TrataCliente implements Runnable {
   
   private InputStream cliente;
   private Servidor servidor;

   public TrataCliente(InputStream cliente,Servidor servidor){
   
   this.cliente = cliente;
   this.servidor = servidor;
 }

   public void run() {
   
   //quando chegar uma msg distribui pra todos
   
   Scanner s = new Scanner(this.cliente);
	 
   while (s.hasNextLine()) {
		 servidor.distribuiMensagem(s.nextLine());
		 }
	 s.close();

}
}
}

[/code][/quote]