有一个客户端和服务端,客户端有一个image控件和一个按钮,image控件里有一张图片,点击按钮后,将image中的图片以流的形式发送给服务端,服务端接收后利用image空间在服务端窗体上显示出来,请问该如何实现!我写的代码总是不停的报错!求救!!
解决方案 »
- documentproperties 怎么没有生效?
- 如何利用QReport组件输出HTML文件?急!!
- 请问如何实现启动画面听留的时间?比如三秒钟!
- 怎么看怎么都没错啊,他怎么提示出错啊?
- 十万火急!!!给定用户名,口令,如何建立与另外一台机器的连接,从而可以复制它上面的文件!
- 都说delphi编译器好,具体怎么体现的,我觉得查错和运行都跟vb差不多
- 怎样取一个pchar类型的长度?
- 关于wm_move与动态创建控件的问题
- intraweb中mainmenu 的用法
- 有谁知道象刚装好的WINDOWS那个点击这里开始那样的窗体,DELPHI有吗???
- 求:附加数据库的源代码
- Delphi8中怎样取得MessageBox的返回值。DialogResult总报错.
TFileServerThread=class(TServerClientThread)
public
constructor Create(CreateSuspended: Boolean; ASocket: TServerClientWinSocket);
procedure ClientExecute; override;
end;
TFileClientThread = class(TThread)
private
FStream: TMemoryStream;
FClientSocket: TClientSocket;
protected
procedure ClientSocketError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer);
public
constructor Create(Host: string; Port: Integer; CreateSuspended: Boolean; aStream: TMemoryStream);
destructor Destroy;override;
procedure Execute;override;
end; TFileInfo = record
FileName: string[128];
FileSize: Int64;
end;implementation{ TFileServerThread }procedure TFileServerThread.ClientExecute;
var
Stream:TWinSocketStream;
FI:TFileInfo;
Buffer:PChar;
ReadLen, TotalLen:Integer;
begin
GetMem(Buffer,4096);
Stream := TWinSocketStream.Create(ClientSocket, 5000);
try
Stream.ReadBuffer(FI,SizeOf(FI));
try
TotalLen := 0;
while TotalLen < FI.FileSize do
begin
ReadLen:=Stream.Read(Buffer^,4096);
Form1.aStream.WriteBuffer(Buffer^,ReadLen);
TotalLen := TotalLen + ReadLen;
end;
except
on E:Exception do;
end;
finally
Stream.Free;
FreeMem(Buffer);
end;
end;constructor TFileServerThread.Create(CreateSuspended: Boolean; ASocket: TServerClientWinSocket);
begin
inherited Create(CreateSuspended,ASocket);
end;{ TFileClientThread }procedure TFileClientThread.ClientSocketError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
ErrorCode := 0;
end;constructor TFileClientThread.Create(Host:String;Port:Integer;CreateSuspended: Boolean; aStream: TMemoryStream);
begin
FreeOnTerminate:=True;
FStream := aStream;
FClientSocket:=TClientSocket.Create(nil);
FClientSocket.ClientType:=ctBlocking;
FClientSocket.Host:=Host;
FClientSocket.Port:=Port;
FClientSocket.OnError:=ClientSocketError;
inherited Create(CreateSuspended);
end;destructor TFileClientThread.Destroy;
begin
FClientSocket.Free;
inherited;
end;procedure TFileClientThread.Execute;
var
Stream:TWinSocketStream;
FI:TFileInfo;
begin
FClientSocket.Active:=True;
if FClientSocket.Active then
begin
Stream := TWinSocketStream.Create(FClientSocket.Socket, 5000);
FI.FileSize := FStream.Size;
try
try
Stream.WriteBuffer(FI,SizeOf(FI));
Stream.CopyFrom(FStream, FStream.Size);
except
on E:Exception do;
end;
finally
Stream.Free;
end;
end;
end;end.
主窗体上放两个Image,ImgClient里放JPG图片,代表客户端要传的图。
ImgServer为空,点“发送后”,ImgServer里显示图片。代码如下:
unit uMain;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ScktComp, StdCtrls, ExtCtrls, jpeg;type
TForm1 = class(TForm)
ServerSocket1: TServerSocket;
Button1: TButton;
Button2: TButton;
ImgClient: TImage;
ImgServer: TImage;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure ServerSocket1GetThread(Sender: TObject;
ClientSocket: TServerClientWinSocket;
var SocketThread: TServerClientThread);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
aStream: TMemoryStream;
procedure RecEnd(Sender: TObject);
end;var
Form1: TForm1;implementation{$R *.dfm}
uses MySocketUnit;procedure TForm1.Button1Click(Sender: TObject);
var
Stream: TMemoryStream;
begin
Stream := TMemoryStream.Create;
ImgClient.Picture.Graphic.SaveToStream(Stream);
Stream.Position := 0;
with TFileClientThread.Create('127.0.0.1',9000,True, Stream) do
begin
OnTerminate:=RecEnd;
Resume;
end;end;procedure TForm1.ServerSocket1GetThread(Sender: TObject;
ClientSocket: TServerClientWinSocket;
var SocketThread: TServerClientThread);
begin
SocketThread := TFileServerThread.Create(False,ClientSocket);
end;procedure TForm1.Button2Click(Sender: TObject);
begin
ServerSocket1.Close;
Close;
end;procedure TForm1.RecEnd(Sender: TObject);
var
pic: TJPEGImage;
begin
aStream.Position := 0; pic := TJPEGImage.Create;
pic.LoadFromStream(aStream);
ImgServer.Picture.Assign(pic);
ImgServer.Refresh; pic.Free;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
aStream := TMemoryStream.Create;
end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
aStream.Free;
end;end.
Active为True。Port为9000
ServerType为stThreadBlocking。还有两个按钮: