| 
	
		|  Autor | Tema: Problema: delphi, socket y envios de archivos  (Leído 10,364 veces) |  
	| 
			| 
					
						| N3Tw0lf 
								
								 Desconectado 
								Mensajes: 20
								
								 
								NETwolf
								
								
								
								
								
								   | 
 
Hola muy buenas gente este es mi primer post en el foro espero que me puedan ayudar (: .tengo este codigo que sirve para que mi cliente socket en delphi reciba un archivo lo entiendo poco, pero igualmente funciona bien con archivos de texto. Se trata de una conexion con de socket normal que trae delphi , el servidor recibe bien archivos de texto (.txt) pero el problema lo tengo cuando quiero mandar un ejecutable, el servidor lo recibe pero vacio :s osea 0 kb  la verdad no tengo la menor idea de cual puede ser el problema alguien me podria dar una mano? en cual es el error o el problema? se lo agradeceria mucho ya que estoy estancado en mi programa por este problema :s les dejo el codigo: Bueno espero que alguien me pueda ayudarprocedure TForm1.ServerSocket1ClientRead(Sender: TObject;  Socket: TCustomWinSocket);var  size: Integer;  strcom, com:string;  nreceived,i:integer;  Stream:  TMemoryStream;  buffer: array  [0..99999] of char;begin strcom:=Socket.ReceiveText; if pos('TOMA',strcom)=1 then  begin        Stream := TMemoryStream.Create;        Screen.Cursor := crHourglass;        try          while True do          begin            nReceived := Socket.ReceiveBuf (Buffer, sizeof (Buffer));            if nReceived <= 0 then              Break            else              Stream.Write (Buffer, nReceived);            Sleep (200);          end;          Stream.Position := 0;          stream.SaveToFile('C:\Prueba.txt');        finally          Stream.Free;          Screen.Cursor := crDefault;        end;  end;
 gracias y saludos
 
 
 |  
						| 
								|  |  
								|  |  En línea | 
 
 Experiencia es el nombre que le damos a nuestros errores |  |  |  | 
			| 
					
						| Khronos14 
								 
								
								 Desconectado 
								Mensajes: 443
								
								 
								A lie is a lie
								
								
								
								
								
								     | 
 
Por lo que veo en tu código haces cosas poco recomendable.
 Un bucle infinito sin sentido, la condición que usas para el break la puedes usar para salir del bucle. El sleep no pinta nada, y la rutina como no se ejecuta en un thread te falta un Application.ProcessMessages dentro del bucle para que no se te congele la aplicación.
 
 Deberías poner el código del socket que envía el archivo.
 
 Saludos.
 
 
 |  
						| 
								|  |  
								|  |  En línea | 
 
 |  |  |  | 
			| 
					
						| N3Tw0lf 
								
								 Desconectado 
								Mensajes: 20
								
								 
								NETwolf
								
								
								
								
								
								   | 
 
Hola, antes que nada muchas gracias por responder ,al fin alguien me puede dar una ayuda  , bueno la vdad no tengo la menor idea de como manejar esto de enviar y recibir archivos por socket el codigo lo saque de otro foro y fui trantando de entenderlo ejecutandolo varias veces y cambiandole algunas cosas. Te dejo el codigo que envia el archivo: Teniendo el archivo una extension .txt el code transporta el archivo bien sin ningun error pero cuando intento combiar la extension a .exe (un ejecutable) el archivo se crea pero vacio.procedure TForm1.Button1Click(Sender: TObject);varstrm:TMemoryStream;beginstrm:=TMemorystream.Create;strm.LoadFromFile('C:\Pruebaa.txt');clientsocket1.Socket.SendText('TOMA');clientsocket1.socket.SendStream(strm);end; 
 
 Bueno espero que me puedas ayudar
 saludos.
 |  
						| 
								|  |  
								|  |  En línea | 
 
 Experiencia es el nombre que le damos a nuestros errores |  |  |  | 
			| 
					
						| Khronos14 
								 
								
								 Desconectado 
								Mensajes: 443
								
								 
								A lie is a lie
								
								
								
								
								
								     | 
 
¿Que versión de Delphi estás utilizando? Porque si tu versión de Delphi tiene UNICODE hay que hacerlo de una forma u otra, ya que las variables string, char y pchar tienen un valor distinto.
 Saludos.
 |  
						| 
								|  |  
								|  |  En línea | 
 
 |  |  |  | 
			| 
					
						| N3Tw0lf 
								
								 Desconectado 
								Mensajes: 20
								
								 
								NETwolf
								
								
								
								
								
								   | 
 
Delphi 7 ,perdona por no poner todos los datos   , 
 Saludos
 |  
						| 
								|  |  
								|  |  En línea | 
 
 Experiencia es el nombre que le damos a nuestros errores |  |  |  | 
			| 
					
						| d(-_-)b | 
 
talvez mi respuesta no resuelva tu probema, pero por si a caso... Te recomiendo este interesante material. Windows Socket Programming using the WinSock API  ttp://www.felix-colibri.com/papers/web/socket_programming/socket_programming.html A mi personalmente los componentes indy nunca me han gustado. No hay nada mejor que usar la API  aqui puedes encontrar mucho material http://www.delphibasics.info/ suerte. saludos... |  
						| 
								|  |  
								|  |  En línea | 
 
 Max 400; caracteres restantes: 366 |  |  |  | 
			| 
					
						| N3Tw0lf 
								
								 Desconectado 
								Mensajes: 20
								
								 
								NETwolf
								
								
								
								
								
								   | 
 
Hola , muchas gracias por interesarte, el primer enlace lo conocia y esta bueno, el segundo enlace no me sirvio de mucho, igual te lo agradezco nuevamente, concordamos en algo por lo menos jeje a mi tampoco me gustan las indy  . hay >_< espero que alguien me pueda ayudar por que ya ase mas de una semana estoy tratando de buscar la respuesta a mi problema u.u 
 Espero mas respuestas por favor
 
 Saludos.
 |  
						| 
								|  |  
								| « Última modificación: 15 Mayo 2011, 02:03 am por N3Tw0lf » |  En línea | 
 
 Experiencia es el nombre que le damos a nuestros errores |  |  |  | 
			| 
					
						| Khronos14 
								 
								
								 Desconectado 
								Mensajes: 443
								
								 
								A lie is a lie
								
								
								
								
								
								     | 
 
El principal problema está en la función SendStream, que no envía archivos mayores que 8192 bytes, no se porqué. La solución es hacer un pequeño algoritmo para que lea del fichero y a la vez los mande por un socket. unit Unit1; interface uses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, ScktComp, StdCtrls; type  TFMain = class(TForm)    ClientSocket1: TClientSocket;    ServerSocket1: TServerSocket;    Button1: TButton;    procedure FormCreate(Sender: TObject);    procedure Button1Click(Sender: TObject);    procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);    procedure FormDestroy(Sender: TObject);  private    { Private declarations }  public    { Public declarations }  end; var  FMain: TFMain;  fsToReceive: TFileStream; implementation {$R *.dfm} procedure TFMain.Button1Click(Sender: TObject);varBuff: array [0..1023] of byte;BytesRead: integer;fsToSend: TFileStream;begin  try    fsToSend:= TFileStream.Create('C:\prueba.mp3', fmOpenRead or fmShareDenyWrite);    fsToSend.Seek(0, 0);     repeat      FillChar(Buff, 1024, 0);      BytesRead:= fsToSend.Read(Buff, 1024);      Application.ProcessMessages;      if BytesRead > 0 then        ServerSocket1.Socket.Connections[0].SendBuf(Buff, SizeOf(Buff));    until fsToSend.Position = fsToSend.Size;   finally    fsToSend.Free;  end;end; procedure TFMain.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);varBytesRead: integer;Buff: array [0..1023] of byte;begin  if Assigned(fsToReceive) = false then    fsToReceive:= TFileStream.Create('C:\recibido.mp3', fmCreate or fmOpenReadWrite);   FillChar(Buff, 1024, 0);  BytesRead:= Socket.ReceiveBuf(Buff, 1024);  fsToReceive.Write(Buff, BytesRead);end; procedure TFMain.FormCreate(Sender: TObject);begin  try    ServerSocket1.Active:= True;    ClientSocket1.Active:= True;  Except on Exception do    raise Exception.Create('Ocurrió con el servidor o con el cliente');  end;end; procedure TFMain.FormDestroy(Sender: TObject);begin  if Assigned(fsToReceive) then    fsToReceive.Free;end; end.  
 Aquí la prueba la hice enviando desde el servidor, pero sería lo mismo desde el cliente. Saludos. |  
						| 
								|  |  
								|  |  En línea | 
 
 |  |  |  |  |  | 
			| 
					
						| Khronos14 
								 
								
								 Desconectado 
								Mensajes: 443
								
								 
								A lie is a lie
								
								
								
								
								
								     | 
 
El código que te puse a mi me funciona perfectamente. En el Form solo tengo un botón, un TClientSocket y un TServerSocket.
 Saludos.
 |  
						| 
								|  |  
								|  |  En línea | 
 
 |  |  |  |  |  
 
	
 
 
				
					
						| Mensajes similares |  
						|  | Asunto | Iniciado por | Respuestas | Vistas | Último mensaje |  
						|   |   | Cómo enviar archivos vía socket en java Java
 | Nekro_Psycho | 0 | 15,712 |  10 Enero 2006, 21:29 pm por Nekro_Psycho
 |  
						|   |   | Desenpaquetar archivos enpaquetados con Borland Delphi 3.0 Software
 | rin1 | 1 | 3,550 |  11 Mayo 2011, 02:11 am por SuperDraco
 |  
						|   |   | Socket en delphi y sus manejos Programación General
 | N3Tw0lf | 3 | 4,597 |  22 Mayo 2011, 14:26 pm por skapunky
 |  
						|   |   | metodo POST delphi INDY reintentar si se produce socket error Programación General
 | OssoH | 0 | 2,055 |  22 Octubre 2013, 10:22 am por OssoH
 |  
						|   |   | Envios y recibos de caracteres VB .net .NET (C#, VB.NET, ASP)
 | Meta | 1 | 2,610 |  1 Marzo 2015, 18:08 pm por Eleкtro
 |    |