|
|
|
谈Delphi编程中“流”的应用
作者:Webmaster 来源:Linuxdby.com 点击:
日期:2007-06-05
[收藏] [投稿]
IE是否经常中毒?推荐您
|
Myjpg.SaveToStream(MyStream); {将JPG图象写入流中} Myjpg.free; MyStream.Position := 0;{注意:必须添加此句} s1 := inttostr(MyStream.size);{流的大小} Socket.sendtext(s1); {发送流大小} finally MyBmp.free; end; end; if s = 'ready' then {客户端已准备好接收图象} begin MyStream.Position := 0; Socket.SendStream(MyStream); {将流发送出去} end; end; end.
上面是服务端,下面我们来写客户端程序。新建一个工程,添加Socket控件ClientSocket、图像显示控件Image、一个 Panel 、一个Edit、两个 Button和一个状态栏控件StatusBar1。注意:把Edit1和两个 Button放在Panel1上面。ClientSocket的属性跟ServerSocket差不多,不过多了一个Address属性,表示要连接的服务端IP地址。填上IP地址后点“连接”将与服务端程序建立连接,如果成功就可以进行通讯了。点击“抓屏”将发送字符给服务端。因为程序用到了JPEG图像单元,所以要在Uses中添加Jpeg. 全部代码如下: unit Unit2{客户端}; interface uses Windows,Messages,SysUtils,Classes,Graphics,Controls,Forms,Dialogs,StdCtrls,ScktComp,ExtCtrls,Jpeg, ComCtrls; type TForm1 = class(TForm) ClientSocket1: TClientSocket; Image1: TImage; StatusBar1: TStatusBar; Panel1: TPanel; Edit1: TEdit; Button1: TButton; Button2: TButton; procedure Button1Click(Sender: TObject); procedure ClientSocket1Connect(Sender: TObject; Socket: TCustomWinSocket); procedure Button2Click(Sender: TObject); procedure ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket); procedure FormCreate(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure ClientSocket1Disconnect(Sender: TObject; Socket: TCustomWinSocket); private { Private declarations } public { Public declarations } end; var Form1: TForm1; MySize: Longint; MyStream: TMemorystream;{内存流对象} implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin {-------- 下面为设置窗口控件的外观属性 ------------- } {注意:把Button1、Button2和Edit1放在Panel1上面} Edit1.Text := '127.0.0.1'; Button1.Caption := '连接主机'; Button2.Caption := '抓屏幕'; Button2.Enabled := false; Panel1.Align := alTop; Image1.Align := alClient; Image1.Stretch := True; StatusBar1.Align:=alBottom; StatusBar1.SimplePanel := True; {----------------------------------------------- } MyStream := TMemorystream.Create; {建立内存流对象} MySize := 0; {初始化} end; procedure TForm1.Button1Click(Sender: TObject); begin if not ClientSocket1.Active then begin ClientSocket1.Address := Edit1.Text; {远程IP地址} ClientSocket1.Port := 3000; {Socket端口} ClientSocket1.Open; {建立连接} end; end; procedure TForm1.Button2Click(Sender: TObject); begin Clientsocket1.Socket.SendText('cap'); {发送指令通知服务端抓取屏幕图象} Button2.Enabled := False; end; procedure TForm1.ClientSocket1Connect(Sender: TObject; Socket: TCustomWinSocket); begin StatusBar1.SimpleText := '与主机' + ClientSocket1.Address + '成功建立连接!'; Button2.Enabled := True; end; procedure TForm1.ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); begin Errorcode := 0; {不弹出出错窗口} StatusBar1.SimpleText := '无法与主机' + ClientSocket1.Address + '建立连接!'; end; procedure TForm1.ClientSocket1Disconnect(Sender: TObject; Socket: TCustomWinSocket); begin StatusBar1.SimpleText := '与主机' + ClientSocket1.Address + '断开连接!'; Button2.Enabled := False; end; procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket); var MyBuffer: array[0..10000] of byte; {设置接收缓冲区} MyReceviceLength: integer; S: string; MyBmp: TBitmap; MyJpg: TJpegimage; begin StatusBar1.SimpleText := '正在接收数据......'; if MySize = 0 then {MySize为服务端发送的字节数,如果为0表示为尚未开始图象接收} begin S := Socket.ReceiveText; MySize := Strtoint(S); {设置需接收的字节数} Clientsocket1.Socket.SendText('ready'); {发指令通知服务端开始发送图象} end else begin {以下为图象数据接收部分} MyReceviceLength := socket.ReceiveLength; {读出包长度} StatusBar1.SimpleText := '正在接收数据,数据大小为:' + inttostr(MySize); Socket.ReceiveBuf(MyBuffer, MyReceviceLength); {接收数据包并读入缓冲区内} MyStream.Write(MyBuffer, MyReceviceLength); {将数据写入流中} if MyStream.Size >= MySize then {如果流长度大于需接收的字节数,则接收完毕} begin MyStream.Position := 0; MyBmp := tbitmap.Create; MyJpg := tjpegimage.Create; try MyJpg.LoadFromStream(MyStream); {将流中的数据读至JPG图像对象中} MyBmp.Assign(MyJpg); {将JPG转为BMP} StatusBar1.SimpleText := '正在显示图像'; Image1.Picture.Bitmap.Assign(MyBmp); {分配给image1元件 } finally {以下为清除工作 } MyBmp.free; MyJpg.free; Button2.Enabled := true; { Socket.SendText('cap');添加此句即可连续抓屏 } MyStream.Clear; MySize := 0; end; end;
如果您对本文有任何疑问或者建议,请到讨论区发表您的意见:
>>
论坛入口 <<
上一页 1 2 3 4 5 67 下一页
上一篇:如何把数据库的内容写入到Word文档中? 下一篇:如何用Delphi制作录音程序
|
|
|
| 【文章评论】
【收藏本文】
【推荐好友】
【打印本文】
【我要投稿】 【论坛讨论】 |
相关文章: |
| ·如何用Delphi制作录音程序 | ·谈Delphi编程中“流”的应用·如何把数据库的内容写入到Word文档中?·从实作标题栏按钮开始浅谈组件的制作·“98五笔字型输入法”大批量造词·关于Delphi大Bug的更详细的例子·不知您是笨蛋,还是我是笨蛋,关于Delphi·剖析TThread类·理解类引用这种类型·改良控件-Delphi自带控件Bug的消除
文章评论:(1条) |
|
|
|
|
声明:刊登此文章是为了传递更多信息,文章内容仅供参考,转载请注明出处。 |
|