delphi帮助套接字文件发送 [英] delphi help with sockets file send

查看:118
本文介绍了delphi帮助套接字文件发送的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我该如何解决此代码,不确定是否可以在线程内使用消息循环

how can i fix this code, not sure if can i use message loops inside threads

program pClient;

{$APPTYPE CONSOLE}

uses
  Windows,
  SysUtils,
  Classes,
  SimpleTcp;

var
  Stream: TMemoryStream;

procedure ReadFile(nSize: Dword; Socket: TTcpSocket);
var
  Buffer: array[0..4096] of Char;
  Read, CurrRead, BuffSize: Dword;
begin
  BuffSize := SizeOf(Buffer);
  Stream.Clear;
  Stream.SetSize(nSize);
  Read := 0;
  while (Read < nSize) and (Socket.Active) do
  begin
    if (nSize - Read) >= BuffSize then
      CurrRead := BuffSize
    else
      CurrRead := (nSize - Read);
    Socket.Read(Buffer, CurrRead);
    Stream.Write(Buffer, CurrRead);
    Read := Read + CurrRead;
  end;
  Stream.Position := 0;
end;

procedure ProcessData(Socket: TTcpSocket);
var
  Data: string;
  FileSize: Dword;
begin
  while Socket.Active do
  begin
    Socket.ReadLn(Data);
    if Length(Data) > 0 then
    begin
      if Pos(''HELLO'', Data) > 0 then
      begin
        WriteLn(''1 PROC'');
        Delete(Data, 1, Pos(''|'', Data));
        FileSize := StrToInt(Data);
        Stream := TMemoryStream.Create;
        ReadFile(FileSize, Socket);
        Stream.SaveToFile(''REC.PNG'');
        Stream.Free;
        WriteLn(''2 PROC'');
      end;
    end;
    Sleep(5);
  end;
end;

procedure Client(Thread: TThreadProc);
var
  TcpClient: TTcpClient;
begin
  TcpClient := TTcpClient.Create(''localhost'', 1500);
  if TcpClient.Active then
  begin
    TcpClient.WriteLn(''HELLO'');
    ProcessData(TcpClient);
  end;
end;

var
  Msg: TMsg;

begin
  StartThread(@Client);
  while GetMessage(Msg, 0, 0, 0) do
  begin
    TranslateMessage(Msg);
    DispatchMessage(Msg);
  end;
end.





program pServer;

{$APPTYPE CONSOLE}

uses
  Windows,
  SysUtils,
  Classes,
  SimpleTcp;

var
  Stream: TMemoryStream;

procedure SendFile(Socket: TTcpSocket);
var
  Buffer: array[0..4096] of Char;
  Read, CurrRead, BuffSize: Dword;
begin
  BuffSize := SizeOf(Buffer);
  Read := 0;
  while (Read < Stream.Size) and Socket.Active do
  begin
    if (Stream.Size - Read) >= BuffSize then
      CurrRead := BuffSize
    else
      CurrRead := (Stream.Size - Read);
    Stream.Read(Buffer, CurrRead);
    Socket.Write(Buffer, CurrRead);
    Read := Read + CurrRead;
  end;
end;

procedure ProcessData(Socket: TTcpSocket);
var
  Data: string;
begin
  while Socket.Active do
  begin
    Socket.ReadLn(Data);
    if Length(Data) > 0 then
    begin
      if Pos(''HELLO'', Data) > 0 then
      begin
        WriteLn(''1 PROC'');
        Stream := TMemoryStream.Create;
        Stream.LoadFromFile(''IMG.PNG'');
        Socket.WriteLn(''HELLO|'' + IntToStr(Stream.Size));
        SendFile(Socket);
        Stream.Free;
        WriteLn(''2 PROC'');
      end;
    end;
    Sleep(5);
  end;
end;

procedure Server(Thread: TThreadProc);
var
  TcpServer: TTcpServer;
  TcpSocket: TTcpSocket;
begin
  TcpServer := TTcpServer.Create(1500);
  TcpSocket := TcpServer.Accept;
  if TcpSocket.Active then
  begin
    ProcessData(TcpSocket);
  end;
end;

var
  Msg: TMsg;

begin
  StartThread(@Server);
  while GetMessage(Msg, 0, 0, 0) do
  begin
    TranslateMessage(Msg);
    DispatchMessage(Msg);
  end;
end.

推荐答案

APPTYPE CONSOLE} 用途 视窗, SysUtils, 班级 SimpleTcp; 变种 流:TMemoryStream; 过程ReadFile(nSize:Dword;套接字:TTcpSocket); 变种 缓冲区:字符数组[0..4096]; 读取,CurrRead,BuffSize:Dword; 开始 BuffSize:= SizeOf(缓冲区); Stream.Clear; Stream.SetSize(nSize); 读:= 0; 而(Read< nSize)和(Socket.Active)做 开始 如果(nSize-读取)> = BuffSize然后 CurrRead:= BuffSize 别的 CurrRead:=(nSize-读取); Socket.Read(Buffer,CurrRead); Stream.Write(Buffer,CurrRead); 读:=读+ CurrRead; 结尾; Stream.Position:= 0; 结尾; 程序ProcessData(Socket:TTcpSocket); 变种 数据:字符串; FileSize:Dword; 开始 而Socket.Active做 开始 Socket.ReadLn(Data); 如果Length(Data)>然后0 开始 如果Pos(``HELLO'',Data)>然后0 开始 WriteLn(''1 PROC''); Delete(Data,1,Pos(''|'',Data)); FileSize:= StrToInt(Data); 流:= TMemoryStream.Create; ReadFile(FileSize,Socket); Stream.SaveToFile(''REC.PNG''); 流免费 WriteLn(''2 PROC''); 结尾; 结尾; 睡眠(5); 结尾; 结尾; 程序Client(Thread:TThreadProc); 变种 TcpClient:TTcpClient; 开始 TcpClient:= TTcpClient.Create(``本地主机'',1500); 如果TcpClient.Active然后 开始 TcpClient.WriteLn(``HELLO''); ProcessData(TcpClient); 结尾; 结尾; 变种 讯息:TMsg; 开始 StartThread(@Client); 而GetMessage(Msg,0,0,0)做 开始 TranslateMessage(Msg); DispatchMessage(Msg); 结尾; 结束.
APPTYPE CONSOLE} uses Windows, SysUtils, Classes, SimpleTcp; var Stream: TMemoryStream; procedure ReadFile(nSize: Dword; Socket: TTcpSocket); var Buffer: array[0..4096] of Char; Read, CurrRead, BuffSize: Dword; begin BuffSize := SizeOf(Buffer); Stream.Clear; Stream.SetSize(nSize); Read := 0; while (Read < nSize) and (Socket.Active) do begin if (nSize - Read) >= BuffSize then CurrRead := BuffSize else CurrRead := (nSize - Read); Socket.Read(Buffer, CurrRead); Stream.Write(Buffer, CurrRead); Read := Read + CurrRead; end; Stream.Position := 0; end; procedure ProcessData(Socket: TTcpSocket); var Data: string; FileSize: Dword; begin while Socket.Active do begin Socket.ReadLn(Data); if Length(Data) > 0 then begin if Pos(''HELLO'', Data) > 0 then begin WriteLn(''1 PROC''); Delete(Data, 1, Pos(''|'', Data)); FileSize := StrToInt(Data); Stream := TMemoryStream.Create; ReadFile(FileSize, Socket); Stream.SaveToFile(''REC.PNG''); Stream.Free; WriteLn(''2 PROC''); end; end; Sleep(5); end; end; procedure Client(Thread: TThreadProc); var TcpClient: TTcpClient; begin TcpClient := TTcpClient.Create(''localhost'', 1500); if TcpClient.Active then begin TcpClient.WriteLn(''HELLO''); ProcessData(TcpClient); end; end; var Msg: TMsg; begin StartThread(@Client); while GetMessage(Msg, 0, 0, 0) do begin TranslateMessage(Msg); DispatchMessage(Msg); end; end.





program pServer;

{


APPTYPE CONSOLE} uses Windows, SysUtils, Classes, SimpleTcp; var Stream: TMemoryStream; procedure SendFile(Socket: TTcpSocket); var Buffer: array[0..4096] of Char; Read, CurrRead, BuffSize: Dword; begin BuffSize := SizeOf(Buffer); Read := 0; while (Read < Stream.Size) and Socket.Active do begin if (Stream.Size - Read) >= BuffSize then CurrRead := BuffSize else CurrRead := (Stream.Size - Read); Stream.Read(Buffer, CurrRead); Socket.Write(Buffer, CurrRead); Read := Read + CurrRead; end; end; procedure ProcessData(Socket: TTcpSocket); var Data: string; begin while Socket.Active do begin Socket.ReadLn(Data); if Length(Data) > 0 then begin if Pos(''HELLO'', Data) > 0 then begin WriteLn(''1 PROC''); Stream := TMemoryStream.Create; Stream.LoadFromFile(''IMG.PNG''); Socket.WriteLn(''HELLO|'' + IntToStr(Stream.Size)); SendFile(Socket); Stream.Free; WriteLn(''2 PROC''); end; end; Sleep(5); end; end; procedure Server(Thread: TThreadProc); var TcpServer: TTcpServer; TcpSocket: TTcpSocket; begin TcpServer := TTcpServer.Create(1500); TcpSocket := TcpServer.Accept; if TcpSocket.Active then begin ProcessData(TcpSocket); end; end; var Msg: TMsg; begin StartThread(@Server); while GetMessage(Msg, 0, 0, 0) do begin TranslateMessage(Msg); DispatchMessage(Msg); end; end.
APPTYPE CONSOLE} uses Windows, SysUtils, Classes, SimpleTcp; var Stream: TMemoryStream; procedure SendFile(Socket: TTcpSocket); var Buffer: array[0..4096] of Char; Read, CurrRead, BuffSize: Dword; begin BuffSize := SizeOf(Buffer); Read := 0; while (Read < Stream.Size) and Socket.Active do begin if (Stream.Size - Read) >= BuffSize then CurrRead := BuffSize else CurrRead := (Stream.Size - Read); Stream.Read(Buffer, CurrRead); Socket.Write(Buffer, CurrRead); Read := Read + CurrRead; end; end; procedure ProcessData(Socket: TTcpSocket); var Data: string; begin while Socket.Active do begin Socket.ReadLn(Data); if Length(Data) > 0 then begin if Pos(''HELLO'', Data) > 0 then begin WriteLn(''1 PROC''); Stream := TMemoryStream.Create; Stream.LoadFromFile(''IMG.PNG''); Socket.WriteLn(''HELLO|'' + IntToStr(Stream.Size)); SendFile(Socket); Stream.Free; WriteLn(''2 PROC''); end; end; Sleep(5); end; end; procedure Server(Thread: TThreadProc); var TcpServer: TTcpServer; TcpSocket: TTcpSocket; begin TcpServer := TTcpServer.Create(1500); TcpSocket := TcpServer.Accept; if TcpSocket.Active then begin ProcessData(TcpSocket); end; end; var Msg: TMsg; begin StartThread(@Server); while GetMessage(Msg, 0, 0, 0) do begin TranslateMessage(Msg); DispatchMessage(Msg); end; end.


请告诉我们您的问题是什么.
please tell us what is your problem.


这篇关于delphi帮助套接字文件发送的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆