OnConnect, OnDisconnect, OnRead do TClientSocket com Thread
Preciso fazer uso de dois TClientSocket, sendo um para enviar e outro para receber.
No de envio uso os eventos OnConnect, OnDisconnect, OnRead sem problemas. Estou pretendendo usar Thread para ficar recebendo enquanto envio pelo primeiro.
Só que não estou conseguindo fazer funcionar os eventos acima para o TClientSocket de recebimento. Não ocontece nada quando faço Open no TClientSocket dentro da Thread.
A Thread finaliza antes, ela não executa nenhum dos eventos.
O que fazer?
Muito obrigado,
Alessandro.
No de envio uso os eventos OnConnect, OnDisconnect, OnRead sem problemas. Estou pretendendo usar Thread para ficar recebendo enquanto envio pelo primeiro.
Só que não estou conseguindo fazer funcionar os eventos acima para o TClientSocket de recebimento. Não ocontece nada quando faço Open no TClientSocket dentro da Thread.
A Thread finaliza antes, ela não executa nenhum dos eventos.
O que fazer?
Muito obrigado,
Alessandro.
Alesabino
Curtidas 0
Respostas
Massuda
11/08/2005
Preciso fazer uso de dois TClientSocket, sendo um para enviar e outro para receber....
Não tem como fazer isso... Numa comunicação TCP/IP (ou ´via socket´) você precisa ter um socket cliente e outro servidor.GOSTEI 0
Dnolive
11/08/2005
[quote=´alesabino´]Preciso fazer uso de dois TClientSocket, sendo um para enviar e outro para receber.
No de envio uso os eventos OnConnect, OnDisconnect, OnRead sem problemas. Estou pretendendo usar Thread para ficar recebendo enquanto envio pelo primeiro.
Só que não estou conseguindo fazer funcionar os eventos acima para o TClientSocket de recebimento. Não ocontece nada quando faço Open no TClientSocket dentro da Thread.
A Thread finaliza antes, ela não executa nenhum dos eventos.
O que fazer?
Muito obrigado,
Alessandro.
No de envio uso os eventos OnConnect, OnDisconnect, OnRead sem problemas. Estou pretendendo usar Thread para ficar recebendo enquanto envio pelo primeiro.
Só que não estou conseguindo fazer funcionar os eventos acima para o TClientSocket de recebimento. Não ocontece nada quando faço Open no TClientSocket dentro da Thread.
A Thread finaliza antes, ela não executa nenhum dos eventos.
O que fazer?
Muito obrigado,
Alessandro.
--------------------
Estou criando um projeto com estes componentes, se quizer podemos trocar umas figurinhas.
T+
GOSTEI 0
Kapak
11/08/2005
Só que não estou conseguindo fazer funcionar os eventos acima para o TClientSocket de recebimento.
Sendo que vc utiliza dois TClientSocket, gostaria de saber como vc consegue fazer para o TClientSocket de [b:7eb0eb5b11]envio[/b:7eb0eb5b11] funcionar.GOSTEI 0
Alesabino
11/08/2005
[quote:76904c434d=´alesabino´]Preciso fazer uso de dois TClientSocket, sendo um para enviar e outro para receber....
Não tem como fazer isso... Numa comunicação TCP/IP (ou ´via socket´) você precisa ter um socket cliente e outro servidor.[/quote:76904c434d]Como assim?
Vou me explicar melhor Massuda.
Tem um servidor que eu me conecto através do TClientSocket de envio, passo aos parãmetros de login e transmito a minha mensagem.
Como são várias mensagens para enviar, preciso ter um outro TClientSocket de recebimento só para ficar recebendo enquanto continuo mandando pelo de envio. Entendeu?
O que eu fiz foram dois programas que um fica enviando e o outro fica recebendo.
Gostaria de fazer isso em uma Thread dentro de um só programa. Como tenho que usar os eventos Onconnect,..., OnRead não sei como fazer em uma Thread.
Alguém sabe me dizer como?
GOSTEI 0
Massuda
11/08/2005
O que eu fiz foram dois programas que um fica enviando e o outro fica recebendo. Gostaria de fazer isso em uma Thread dentro de um só programa.
Eu não tenho muita experiência com esses componentes, mas a princípio, acho que você não precisa usar uma thread separada só para receber os dados, pois cada TClientSocket irá gerar os eventos separadamente (tenho a impressão que talvez fosse possível usar um único TClientServer, mas isso depende do seu protocolo de comunicação).Se optar por usar uma thread separada, parece que você tem que usar o TClientSocket em modo ctBlocking (toda operação de escrita/leitura só retorna após ser executada, sem gerar eventos). Tem [url=http://bdn.borland.com/article/0,1410,26693,00.html]este exemplo[/url] no site da Borland (para ler o artigo pode ser necessário fazer login ou registrar-se gratuitamente no site).
GOSTEI 0
Kapak
11/08/2005
Acho que vc deve estar num looping de envio e o ServerSocket recebe a msg, processa e retorna dados p/ o ClientSocket de recebimento. Só que como está na thread principal do programa, o looping de envio não deixa o evento onRead do outro Socket acontecer. É mais ou menos isto ?
GOSTEI 0
Alesabino
11/08/2005
[quote:56af3ed29d=´alesabino´]O que eu fiz foram dois programas que um fica enviando e o outro fica recebendo. Gostaria de fazer isso em uma Thread dentro de um só programa.
Eu não tenho muita experiência com esses componentes, mas a princípio, acho que você não precisa usar uma thread separada só para receber os dados, pois cada TClientSocket irá gerar os eventos separadamente (tenho a impressão que talvez fosse possível usar um único TClientServer, mas isso depende do seu protocolo de comunicação).Se optar por usar uma thread separada, parece que você tem que usar o TClientSocket em modo ctBlocking (toda operação de escrita/leitura só retorna após ser executada, sem gerar eventos). Tem [url=http://bdn.borland.com/article/0,1410,26693,00.html]este exemplo[/url] no site da Borland (para ler o artigo pode ser necessário fazer login ou registrar-se gratuitamente no site).[/quote:56af3ed29d]
Vou pesquisar o link e dou retorno, obrigado.
Obrigado.
GOSTEI 0
Alesabino
11/08/2005
Acho que vc deve estar num looping de envio e o ServerSocket recebe a msg, processa e retorna dados p/ o ClientSocket de recebimento. Só que como está na thread principal do programa, o looping de envio não deixa o evento onRead do outro Socket acontecer. É mais ou menos isto ?
Não acho que seja isso.
Vou pesquisar a dica do Massuda e retorno com uma resposta.
Obrigado.
GOSTEI 0
Kapak
11/08/2005
Se optar por usar uma thread separada, parece que você tem que usar o TClientSocket em modo ctBlocking (toda operação de escrita/leitura só retorna após ser executada, sem gerar eventos).
Não necessariamente; utilizo estes componentes e no lado servidor abro threads p/ cada TClientSocket conectado sem utilizar o evento onClientRead. No lado cliente também pode ser feito utilizando ctNonBlocking sem problemas:procedure TClientThread.Execute; begin While not Terminated and Socket.Connected do begin if Socket.ReceiveLength > 0 then begin // Aqui vc processa a informação sem utilizar o evento onRead end; Sleep(1); end;
GOSTEI 0
Massuda
11/08/2005
Não necessariamente; utilizo estes componentes e no lado servidor abro threads p/ cada TClientSocket conectado sem utilizar o evento onClientRead. No lado cliente também pode ser feito utilizando ctNonBlocking sem problemas...
Não tenho muita experiência com esses componentes, mas, no seu exemplo, você lê os dados usando ReceiveText/ReceiveBuf?Na prática, tenho a impressão que seu código equivale (embora seja mais simples) a usar o modo ctBlocking... tem um loop ´inifinito´ esperando os dados chegarem. O Sleep é para evitar 100¬ de uso da CPU?
GOSTEI 0
Kapak
11/08/2005
Na prática, tenho a impressão que seu código equivale (embora seja mais simples) a usar o modo ctBlocking... tem um loop ´inifinito´ esperando os dados chegarem. O Sleep é para evitar 100¬ de uso da CPU?
Exatamente; na verdade o código está bem resumido. Quando ReceiveLength > 0, leio os primeiros 4 bytes(Integer) que me informam o tamanho do que vem a seguir; com isto entro num looping de ReceiveBuf até que toda a leitura tenha sido completada ou ocorrer um Timeout pré-estabelecido.GOSTEI 0
Massuda
11/08/2005
Exatamente; na verdade o código está bem resumido...
Deu para entender como funciona... Obrigado!GOSTEI 0