• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

wrproject

[wxWidgets]cliente nao recebe mensagens

1 mensagem neste tópico

boas pessoal, eu tou a fazer um chat, os dois programas compilam na perfeicao, mas quando vou a executar o cliente nao recebe as mensagens, só as envia mas nao recebe as que enviou, nem as que recebeu.

não sei se é por o servidor estar no mesmo local que o cliente.

estou a usar a biblioteca grafica wxwidgets

ajudem-me pleeeeez.

CLIENTE:

#include <wx/wx.h> 
#include <wx/socket.h> 
class chat_cliente: public wxApp 
{ 
    public: 
        wxFrame *janela; 
        wxSocketClient *cliente; 
        wxTextCtrl *mensagens; 
        wxTextCtrl *escreve; 
        wxButton *botao_envia; 
        wxButton* botao_limpa; 


    bool OnInit() 
    { 


        wxString hostname; 
        hostname=wxGetHostName(); 
        wxString titulo("CHAT by Cuginguilua Power "); 
        wxSize tamanho_janela(640,580); 
        wxPoint posicao_janela(350,400); 


        long estilo_janela = wxCAPTION | wxCLOSE_BOX | wxSYSTEM_MENU | wxMAXIMIZE_BOX | wxMINIMIZE_BOX; 
        janela=new wxFrame(NULL,-1,titulo,posicao_janela,tamanho_janela,estilo_janela); 
        
        //criacao da barra de status 
        janela->CreateStatusBar(1); 
        
        //objecto que guardara o host e  a porta 
        wxIPV4address addr; 

        //endereco para conectar 
        wxString host=hostname; 
        addr.Hostname(host); 

        int port=9876; 
        addr.Service(unsigned(port)); 
        cliente=new wxSocketClient(); 
        cliente->Connect(addr); 
        if(cliente->IsConnected()) 
        { 
            wxMessageBox("conectado ao host","aviso"); 

        } 
        else 
        { 
            wxMessageBox("nao conectado ao host","aviso"); 
            
        } 
        //criacao do controlo das mensagens 
        wxPoint pos_mensagem(37,37); 
        wxSize tam_mensagem(540,350); 
        long estilo_mensagem=wxTE_READONLY | wxTE_MULTILINE ; 
        mensagens=new wxTextCtrl(janela,-1,"",pos_mensagem,tam_mensagem,estilo_mensagem); 

        //criacao do controlo da escrita das mensagens 
        wxPoint pos_escreve(37,400); 
        wxSize tam_escreve(450,35); 
        long estilo_mensagem1=wxTE_MULTILINE; 
        escreve=new wxTextCtrl(janela,-1,"",pos_escreve,tam_escreve,estilo_mensagem1); 

        //caracteristicas do botao 
        wxPoint pos_botao(510,400); 
        wxSize tam_botao(100,45); 
        wxString label_botao("enviar mensagem"); 
        botao_envia=new wxButton(janela,2,label_botao,pos_botao,tam_botao); 

        //caracteristicas do botao limpar 
        wxPoint pos_botao_limpa(37,480); 
        wxSize tam_botao_limpa(100,45); 
        wxString label_botao_limpa("limpar"); 
        botao_limpa=new wxButton(janela,3,label_botao_limpa,pos_botao_limpa,tam_botao_limpa); 
        janela->Centre(); 
        janela->Show(); 
    return true; 
} 
void OnClick(wxCommandEvent& evento) 
{    
int id; 
unsigned int i; 
    //buffer 
    char buf[1024]; 
    id=evento.GetId(); 
    if(id==2) 
   { 
        wxString mensagem; 
         wxMessageBox("clicaste no botao","aviso"); 
        //string para o output 
        //wxString output; 

        //obter valor dop textfield 
        mensagem=escreve->GetValue(); 
        mensagem.Trim();              
        escreve->Clear(); 
        for(i=0;i<mensagem.Length();i++) 
        { 
            buf[i]=mensagem.GetChar(i); 
        } 
        cliente->Write(buf,sizeof(buf)); 
                                  
    }    
//se o botao limpar foi clicado, entao ira executar a accao abaixo 
else 
{ 
    mensagens->Clear(); 
} 
} 
void oninput(wxSocketEvent& event) 
{ 
    //evento que sera chamado automaticamente quando for detectado entrada/saida de dados 
    unsigned int i=0; 
    wxSocketBase *sock=event.GetSocket(); 
    
    switch(event.GetSocketEvent()) 
    { 
        case wxSOCKET_INPUT: 
        { 
            char buf[1024]; 
            
            //obtem os caracteres vindo do servidor 
            sock->Read(buf,sizeof(buf)); 
            
            wxString s=_(""); 
            
            for(i=0;i<sizeof(buf);i++) 
            { 
                s.Append(buf[i],1); 
            } 
            janela->Refresh(true); 
            mensagens->AppendText("\n\n"); 
            mensagens->AppendText(s); 
            janela->Refresh(true); 
            break; 
        } 
          
    case wxSOCKET_OUTPUT: 
        { 
            break; 
        } 
    case wxSOCKET_CONNECTION: 
        { 
            janela->SetStatusText("conectado ao servidor"); 
            break; 
        } 
    case wxSOCKET_LOST: 
        { 
            wxMessageBox("perdida a comunicacao com o servidora","aviso"); 
            break; 
        } 
    } 
}      
DECLARE_EVENT_TABLE() 
}; 
BEGIN_EVENT_TABLE(chat_cliente,wxApp) 
  
EVT_BUTTON(2,chat_cliente::OnClick) 
EVT_BUTTON(3,chat_cliente::OnClick) 
EVT_SOCKET(0,chat_cliente::oninput) 
END_EVENT_TABLE() 
//Iniciar a aplicacao 
IMPLEMENT_APP(chat_cliente) 

SERVIDOR:

#include <wx/wx.h> 
#include <wx/socket.h> 

class chat:public wxApp 
{ 
    public: 
        wxFrame *janela; 
        wxSocketServer *servidor; 
        char buf[1024]; 
        wxTextCtrl *info; 
        
        
        
        

    bool OnInit() 
    { 

        //string que ira armazenar o nome do host 
        wxString hostname; 
        //obtencao do host atraves da funcao wxGetHostName 
         hostname=wxGetHostName(); 

        //avido para mostrar o nome do host, isto é necessario para podermos saber 
        //o endereco do host quando for a hora de conectar 
        wxMessageBox(hostname,"server demo"); 

        //objecto que armazenara o nome do host, e a porta 
        wxIPV4address addr; 
        addr.Hostname(hostname); 
        int port=9876; 
        addr.Service(port); 

        //definindo a janela principal 
        wxString titulo("CHAT by Cuginguilua Powr "); 
        wxSize tamanho_janela(500,250); 
        wxPoint posicao_janela(350,400); 
        long estilo_janela = wxCAPTION | wxCLOSE_BOX | wxSYSTEM_MENU; 
        janela=new wxFrame(NULL,-1,titulo,posicao_janela,tamanho_janela,estilo_janela); 
        janela->CreateStatusBar(1); 

        

       //info port 
        wxPoint pos_info(50,100); 
        wxSize tam_info(230,75); 
        info=new wxTextCtrl(janela,-1,"",pos_info,tam_info); 

    
    
      

        



        //condicao para verificar se o host foi criado com sucesso 
        servidor=new wxSocketServer(addr,wxSOCKET_NOWAIT); 
        if(servidor->IsOk()) 
        { 
         wxMessageBox("server criado com sucesso","server demo"); 
        } 
        info->AppendText("a porta que esta a ser utilizada e : "); 
        info->AppendText("porta 9676"); 

        janela->SetStatusText(hostname,0); 
        ; 
        janela->Centre(); 
        janela->Show(); 

    return true; 
} 



//evento do input 
void oninput(wxSocketEvent& event) 
{ 

    wxSocketBase* sock=event.GetSocket(); 

    char buf[1024]; 

    unsigned int i=0; 

   switch(event.GetSocketEvent()) 
   { 
        case wxSOCKET_CONNECTION: 
        { 
            janela->SetStatusText("servidor on-line",0); 
            break; 
        } 

        case wxSOCKET_INPUT: 
        { 

            wxString s(""); 

        //obtem os caracteres vindo do cliente 
        sock->Read(buf,sizeof(buf)); 
        for(i=0;i<sizeof(buf);i++) 
        { 
            s.Append(buf[i],1); 
        } 
        info->AppendText("\n\nola"); 
        info->AppendText(s); 

        //manda os caracteres de volta para o cliente 
        sock->Write(buf,sizeof(buf)); 
        break; 
        } 
        case wxSOCKET_OUTPUT: 
        { 
            sock->Write(buf,sizeof(buf)); 
            break; 
        } 
        case wxSOCKET_LOST: 
        { 
               break; 
        } 
    } 
} 
DECLARE_EVENT_TABLE() 
}; 
BEGIN_EVENT_TABLE(chat, wxApp) 
EVT_SOCKET(0, chat::oninput) 

END_EVENT_TABLE() 
IMPLEMENT_APP(chat) 


agradeco a vossa ajuda.  :(

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora