Sockets

Delphi

09/08/2005

Estou fazendo uma aplicação que se comunica através de Socket.

No servidor utilizei o TServerSocket com as seguinte config:


[list:89c5153534]Port: 7000
o Resto deixei default
[/list:u:89c5153534]

e no cliente utilizei o TClientSocket, com as seguintes confg:

[list:89c5153534]Host: ip do servidor
Port: 7000
o resto deixei o default[/list:u:89c5153534]

agora olha que eu faço:
1º Ativo o server
2º mando o cliente se conectar
3º A Funcao TServerSocket.Socket.activeconections me retorna 1, ou seja correto
4º envio comando para o cliente, e o cliente receber normal
Comando usado para enviar comando para o cliente
for i := 0 to server.Socket.ActiveConnections -1 do
begin
 server.Socket.Connections[i].SendText(mensagem);
end;

e pego a mensagem através do envento onread do clientsocket
até aí tudo ok.

mas quando tento enviar algum comando do cliente para o servidor, da erro.
Estou usando o seguinte comando para enviar mensagem para o server
ClientSocke1t.Socket.SendText(Mensagem);

e erro é seguinte:

No cliente da:

[b:89c5153534]Asynchronous socket error 10053[/b:89c5153534]

No server da:

[b:89c5153534]Windows Socket error: Uma solicitação de envio ou recebimento de dados não foi permititda porque o sockete não esta conectado e ( durante o envio de datagrama usando -se uma chamada sendto) não foi fornecido um endereço (10057), omn api, ´recv´[/b:89c5153534]


Sistemald

Sistemald

Curtidas 0

Respostas

Massuda

Massuda

09/08/2005

Eu não tenho muita experiência com esses componentes, mas eu sugiro que você trate o evento TClientSocket.OnDisconnect para tentar detectar se você está sendo desconectado do servidor bem como tratar TServerSocket.OnClientError para detectar eventuais erros ao comunicar com o cliente.


GOSTEI 0
Massuda

Massuda

09/08/2005

Pelo que li na Ajuda do Delphi, uma causa possível da desconexão que aparentemente está ocorrendo seria ocorrer uma exceção em SendText ao enviar o comando para o cliente...
for i := 0 to server.Socket.ActiveConnections -1 do
begin
 server.Socket.Connections[i].SendText(mensagem);
end;
Experimente verificar se o retorno de SendText é ZERO (o que indica sucesso). O conteúdo da mensagem é muito grande?


GOSTEI 0
Sistemald

Sistemald

09/08/2005

Estava fazendo teste aqui, descobri que o erro, está no server no Evendo ClienteRead.

Ainda não descobri, qual linha, ou qual comando, mas ja estou no caminho, pois fiz um sistema bem pequeno, para testar e deu tudo ok.

valeu pela ajuda, qualquer posto aqui.


GOSTEI 0
Sistemald

Sistemald

09/08/2005

Descobri o probrema, é o seguinte:

Durante o evento OnclientRead, eu fazia a chamada a seguinte procedure:
procedure Tfrmprincipal.Imprimir(mensagem: string);
var
I:integer;
begin
//imprimir a mensagem
for i := 0 to server.Socket.ActiveConnections -1 do
begin
 server.Socket.Connections[i].SendText(mensagem);
end;
lista.items.Add(mensagem);
Lista.ItemEnabled[Lista.Items.Count - 1]:=False;
end;


Ou seja durante a leitura da mensagem recebida, e estava tentado enviar uma mensagem para todos os clientes.


Sem a chamada a essa procedure funcionou blz.

Só tem um problema, olha o que eu preciso fazer:

Fazer a leitura da mensagem enviado pelo cliente, até aí ok.
dependendo do texto, o server não faz nada(coloca apenas o texto em uma lista) até aí ok.
Se a mensagem começar com ´imprimir´, ele deve enviar a mensagem para todos os clientes. aí não consigo, ainda.
pois se eu chamas a procedure da erro.


GOSTEI 0
Sistemald

Sistemald

09/08/2005

Deculpa, eu de novo... :shock:
o problema era outro. :oops:

era a seguinte linha:

mensagem:= Server.Socket.ReceiveText;

correto é:

mensagem:= Socket.ReceiveText;


GOSTEI 0
Massuda

Massuda

09/08/2005

Legal que deu para resolver o problema.
...durante a leitura da mensagem recebida, e estava tentado enviar uma mensagem para todos os clientes.
Geralmente não tem problema em fazer isso, porque a comunicação via sockets (ou TCP/IP) funciona como uma estrada de duas pistas, quando uma pista está ocupada não significa que a outra pista também esteja.


GOSTEI 0
POSTAR