Galera, estou com um probleminha, estou criando um chat e para isso estou usando sockets, porém tem um problema, não estou conseguindo receber o que é enviado
Por exemplo, tenho o seguinte trecho:
[code]
public void enviarMensagem(int nCodigo,String sTrama){
try{
DataOutputStream dos=new DataOutputStream(s.getOutputStream());
dos.writeInt(nCodigo);
dos.writeUTF(sTrama);
System.out.println(“passou1”);
}catch(Exception e){
JOptionPane.showMessageDialog(null, "Nao se pode enviar a mensagem");
}
}[/code]
e no meu run eu tenho:
[code] public void run(){
//System.out.println(“a”);
try{
DataInputStream dis=new DataInputStream(s.getInputStream());
while(true){
int nCodigo=dis.readInt();
String sTrama=dos.toString();
ventana.alterar(sTrama);
}
}catch(Exception e){
}
}[/code]
O programa trava quando eu boto o nCodigo para receber o dis.readInt(), alguma dica? Lembrando que esse ‘s’ é meu socket que recebe o ipl loopback e uma porta qualquer
A dica é que os comandos de leitura de stream’s bloqueiam a thread atual até receber dados. Ou seja, o seu DataInputStream trava no readInt porque não tem nenhum int para ele receber. Daí, você tem que pensar no óbvio:
1 - você levantou o “outro lado” da comunicação ?
2 - o “outro lado” da comunicação está enviando dados ?
Vc está fazendo esse chat para estudo ou profissionalmente ?
rmendes obrigado pela ajuda
Mas quando eu coloco dos.writeInt(nCodigo), ao ler dis.readInt() não era para me retornar o valor nCodigo?
Flavio, é profissionalmente mesmo =)
Abraços
[quote=LucasPokemon]rmendes obrigado pela ajuda
Mas quando eu coloco dos.writeInt(nCodigo), ao ler dis.readInt() não era para me retornar o valor nCodigo?
Flavio, é profissionalmente mesmo =)
Abraços[/quote]
aí é que está a questão … por um acaso, ao falar no telefone, a sua voz saiu no seu próprio telefone ou no telefone de quem você está ligando ? você está com um cliente e um servidor levantados ? como os clientes se conectam ?
No começo eu rodo um servidor que abre a porta 7878, ai depois eu crio esse socket s que vai na porta 7878 e uso meu iploopback
Não entendo o que pode estar dando errado, até porque eu me guiei por um exemplo de chat que deu certo
vlw pela atençao
[quote=LucasPokemon]No começo eu rodo um servidor que abre a porta 7878, ai depois eu crio esse socket s que vai na porta 7878 e uso meu iploopback
Não entendo o que pode estar dando errado, até porque eu me guiei por um exemplo de chat que deu certo
vlw pela atençao[/quote]
Pra quê você usa o ip loopback ?
Por que quando eu abro o socket,eu abro na minha maquina certo? Ai eu uso o ip loopback que eu sei que a porta no casso 7878 vai estar aberta nele
Estou correto?
[quote=LucasPokemon]Por que quando eu abro o socket,eu abro na minha maquina certo? Ai eu uso o ip loopback que eu sei que a porta no casso 7878 vai estar aberta nele
Estou correto?[/quote]
afff … tá certo, viajei aqui.
Mas deixa eu ver se entendi, você diz que levanta um socket server na porta 7878. Daí você conecta o seu cliente nesse server socket, escreve dados através do socket cliente e o servidor não recebe, é esse o seu problema ?
Bem, na realidade meu problema não chega a ser isso,posso estar errando apenas em definição.
Quando eu crio o:
DataOutputStream dos=new DataOutputStream(s.getOutputStream());
dos.writeInt(nCodigo);
O que que isso faz?
DataInputStream dis=new DataInputStream(s.getInputStream());
int nCodigo=dis.readInt();
e isso?
Esse dis não era pra receber o que foi colocado no dos?
Bem, na realidade meu problema não chega a ser isso,posso estar errando apenas em definição.
Quando eu crio o:
DataOutputStream dos=new DataOutputStream(s.getOutputStream());
dos.writeInt(nCodigo);
O que que isso faz?
DataInputStream dis=new DataInputStream(s.getInputStream());
int nCodigo=dis.readInt();
e isso? Quando eu faço o dis.readInt() o que era pra ser executado?
Esse dis não era pra receber o que foi colocado no dos?
doublepost malz =x
Cara, acho que você não está entendendo o seguinte. O chat é uma aplicação que tem ser feita em duas partes, cliente e servidor. Em ambos os lados você precisa abrir sockets de entrada e saída … É por isso que eu citei o exemplo do telefone. Quando você fala no telefone, a sua voz sai do outro lado da linha, e quando alguém fala do outro lado, você escuta a voz da pessoa. É a mesma coisa com sockets. Uma comunicação de sockets precisa de uma lado servidor e um lado cliente. Quando você abre uma comunicação entre os sockets os dados que você escreve no socket cliente são recebidos pelo socket servidor. O cliente por sua vez recebe apenas os dados que foram escritos pelo servidor. A minha sugestão é que você comece com um exemplo mais simples ainda. Para você entender como os sockets funcionam, pois além disso, você vai precisar fazer a coisa multi-thread para funcionar de verdade.
É porque eu peguei isso de um exemplo,e no exemplo dava certo.
Bem,quando eu faço
DataOutputStream dos=new DataOutputStream(s.getOutputStream());
dos.writeInt(nCodigo);
o que isso faz?
e no:
DataInputStream dis=new DataInputStream(s.getInputStream());
int nCodigo=dis.readInt();
esse dis.readInt() me retorna o que?
Se puder tirar essas duvidas agradeceria mto
abraços e vlw pela atençao
Cara, fiz o exemplo mais simples possível, perceba que são dois programas, um servidor e um cliente. Nesse exemplo, o servidor apenas recebe mensagens do cliente, e o cliente apenas envia
public class ServerExample {
public static void main(String[] args) {
try {
ServerSocket serverSocket = new ServerSocket(5555);
System.out.println("server [5555]: aguardando conexão");
Socket socket = serverSocket.accept();
System.out.println("conexão aceita ...");
InputStreamReader in = new InputStreamReader(socket.getInputStream());
BufferedReader reader = new BufferedReader(in);
while(true){
String mensagemEnviadaPeloCliente = reader.readLine();
System.out.println(mensagemEnviadaPeloCliente);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
public class ClientExample {
public static void main(String[] args) {
try {
Socket socket = new Socket("127.0.0.1", 5555);
InputStreamReader in = new InputStreamReader(System.in);
BufferedReader reader = new BufferedReader(in);
PrintStream ps = new PrintStream(socket.getOutputStream());
while (true) {
System.out.println("Pronto para enviar mensagem:");
String mensagemParaEnviar = reader.readLine();
ps.println(mensagemParaEnviar);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
rmendes vlw pela ajuda ai cara, de verdade
chegar em ksa eu tento ajeita
abraços
O seu servidor está enviando as mensagens de volta para os clientes?
Consegui galera, valeu pela ajuda =D
Acho que o meu erro era que só o cliente criava conexão, porém o socket que aceitava a solicitação da porta abrir não possuia nada que o lia, ai só havia troca por uma das partes
A solução foi toda vez que eu abria uma porta, adicionava ela em uma arraylist e criava metodos para ler (dis e dos)
Abraços