PDA

Ver la Versión Completa : UDP send jpg


Mike Deet
17-11-2007, 16:29:41
ola

tenho um problema quando tento enviar uma stream por udp ~

o codigo é o sueguinte


procedure TForm1.ButtonSendClick(Sender: TObject);
var
MyStream: TmemoryStream;
Begin
NMUDP1.ReportLevel := Status_Basic;
NMUDP1.RemoteHost := Edit1IP.Text;
NMUDP1.RemotePort := StrToInt(Edit2port.Text);
MyStream := TmemoryStream.Create;
try
jpg.JPEGNeeded;
jpg.SaveToStream(MyStream);
NMUDP1.Sendstream(MyStream);
finally
MyStream.Free;
end;


e o erro que da

"write of address 0x00030ffc"

utilizo borland delphi 5

rolandoj
17-11-2007, 23:20:48
Hola,

Los NMUDP forman parte del paquete Fast Net. Este paquete de Delphi 5 tiene muchos errores.

Aunque hay cosas que funcionan bien, en general dado sus errores y el hecho de que fué descontinuando, lo mejor es no usarlo. En su lugar, puedes usar Indy. La versión que yo uso para Delphi 5 es la versión 9.0.18. Puedes descargarla de esta página.

http://www.indyproject.org/Sockets/Download/Files/Indy9.EN.aspx

Yo envío con frecuencia JPG usando Indy. Si necesitas un ejemplo me puedes escribir.

En particular, actualmente lo único que uso de FastNet son los NMSMTP; pero aún esos estoy por migrarlos a Indy para no tener dos tecnologías, ya que en lo demás me he visto obligado a usar Indy

Suerte

Mike Deet
18-11-2007, 01:27:17
Hola

poderias enviar um exemplo para ver como funciona

Saludos

rolandoj
18-11-2007, 14:34:06
Hola,

Bueno, para enviar un archivo desde un cliente a un servidor Web usando Indy debes hacer lo siguiente:

1. Crea un módulo de datos (TDataModule)

2. Colocale un componente TidHTTP (está en la pestaña Indy Clients, creada en el IDE de Delphi por la instalación de Indy)

3. Colocale un componente TIdAntiFreeze, en la pestaña Indy Misc. (este solo es para evitar la "congeladas" típicas de internet, no se usa en el envío en sí)

4. Para nuestro ejemplo, llamemos dmWeb al TDataModule e idConexion al TidHTTP.

5. Descarga la unidad llamada MsMultiPartFormData. La puedes descargar en este enlace:

http://www.pudn.com/downloads49/sourcecode/internet/browser/detail166574.html

Esta es una página en chino; probablemente tú navegador te preguntará si quieres instalar caracteres chinos; puedes decirle que no. Verá al tope de la misma el texto "IndyMultipartFormData" y al lado una flecha verde. Usa esa flecha para descargar un punto Zip que contiene un ejemplo del uso de esta unidad; pero lo que interesa es solo la unidad en sí que es muy pequeña.

6. Ahora agrega la unidad MsMultiPartFormData a tú proyecto y a la clausula Uses de tú TDataModule

7. Finalmente crea un método cuya apariencia es la siguiente:

Procedure TdmWeb.GrabarImagen(ACode,AFileName:String);
Var
TheURL: String;
ResponseStream: TMemoryStream;
MultiPartFormDataStream: TMsMultiPartFormDataStream;
Begin
TheURL := 'http://localhost/MiDirectorio/Miservidor.dll/MiAccion';
MultiPartFormDataStream := TMsMultiPartFormDataStream.Create;
ResponseStream := TMemoryStream.Create;
try
idConexion.Request.ContentType := MultiPartFormDataStream.RequestContentType;
{ Agrega cada dato a enviar }
MultiPartFormDataStream.AddFormField('ELCODIGO', ACode);
MultiPartFormDataStream.AddFile('ELARCHIVO', AFileName, 'image/jpg');
{ Prepara el envío. Esto es obligatorio }
MultiPartFormDataStream.PrepareStreamForDispatch;
MultiPartFormDataStream.Position := 0;
{ Envía los datos }
idConexion.Post(TheURL,MultiPartFormDataStream, ResponseStream);
finally
MultiPartFormDataStream.Free;
ResponseStream.Free;
end;
End;

Este ejemplo envía una imagen JPG; pero puedes aplicarlo a otros tipos de archivo. Como te podrás dar cuenta. El asunto es solo cosa de cambiar el parámetro 'image/jpg' por el adecuado para tú archivo

Ahora bien, la línea que hace referencia al campo 'ELCODIGO' no es necesaria. La coloco solo para ilustrar el hecho que junto al archivo se pueden enviar otros datos como campos normales. De hecho se pueden enviar varios archivos a la vez. Creo que es claro que agregar un campo es usar un AddFormField y agregar un archivo es usar un AddFile

Lógicamente, el valor "ELARCHIVO" es para dar un nombre al archivo que se envía y el valor AFileName es el nombre de la ruta completa del archivo en el equipo cliente.

Me comentas si necesitas ayuda del lado del servidor

Suerte

Mike Deet
18-11-2007, 16:59:49
muchas gracias

rolandoj
18-11-2007, 18:09:15
muchas gracias

Es un placer ayudar. No olvides contarme si todo te funciona bien

Mike Deet
18-11-2007, 18:27:55
hola
o teu codigo utiliza o protocolo HTTP e eu queria utilizar o protocolo UDP

o meu codigo

procedure TForm1.ButtonSendClick(Sender: TObject);
var
MyStream: TmemoryStream;
Begin
IdUDPServer1.Active:=true;
MyStream:=TMemoryStream.Create;
MyStream.Position:=0;
IdUDPClient1.Host:=Edit1IP.Text;
IdUDPClient1.Port:=strtoint(Edit2port.Text);
jpg.JPEGNeeded;
jpg.SaveToStream(MyStream);
IdUDPClient1.SendBuffer(MyStream.memory^,MyStream.size)
end;

mas da um erro ao tentar enviar

message too long

Saludos

rolandoj
18-11-2007, 19:10:13
Hola,

Lo siento, yo no he usado nunca el protocolo UDP y no tengo en este momento el tiempo para investigarlo. Sin embargo, recordaba haber leído algo de que hay que hacer ajustes al tamaño del buffer y buscando en Internet me encontré este artículo:

http://delphi.about.com/od/adptips2005/qt/udpvstcp.htm

Espero que te ayude en algo.

Supongo que tendrás tús razones para usar UDP; pero si puedes utilizar
HTTP, te diré que el método que te expliqué en mi ejemplo lo uso frecuentemente para enviar a un servidor docenas de imagenes y planos, y nunca he tenido problemas, así que puedes considerarlo como muy confiable.

Suerte

Mike Deet
18-11-2007, 19:12:38
muchas gracias