谈Delphi编程中“流”的应用
作者: Webmaster 来源: Linuxdby.com 点击:
日期: 2007-06-05
[收藏 ] [投稿 ]
IE是否经常中毒?推荐您
解决的办法是在 PSock.pas 在 TThreadTimer.Wndproc 内 Result := DefWindowProc( 0, Msg, WPARAM, LPARAM ); 改为: Result := DefWindowProc( FWindowHandle, Msg, WPARAM, LPARAM ); 早期低版本的OICQ也有这个问题,如果不关闭OICQ的话,关闭计算机时屏幕闪了一下又返回了。 好了,废话少说,让我们编写我们的OICQ吧,这个实际上是Delphi自带的例子而已:) 新建一个工程,在FASTNET面版拖一个NMUDP控件到窗口,然后依次放上三个EDIT,名字分别为EditIP、EditPort、EditMyTxt,三个按钮BtSend、BtClear、BtSave,一个MEMOMemoReceive,一个SaveDialog和一个状态条StatusBar1。当用户点击BtSend时,建立一个内存流对象,把要发送的文字信息写进内存流,然后NMUDP把流发送出去。当NMUDP有数据接收时,触发它的DataReceived事件,我们在这里再把接收到的流转换为字符信息,然后显示出来。 注意:所有的流对象建立后使用完毕后要记得释放(Free),其实它的释构函数应该为Destroy,但如果建立流失败的话,用Destroy会产生异常,而用Free的话程序会先检查有没有成功建立了流,如果建立了才释放,所以用Free比较安全。 在这个程序中我们用到了NMUDP控件,它有几个重要的属性。RemoteHost表示远程电脑的IP或者计算机名,LocalPort是本地端口,主要监听有没有数据传入。而RemotePort是远程端口,发送数据时通过这个端口把数据发送出去。理解这些已经可以看懂我们的程序了。 全部代码如下: unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,StdCtrls, ComCtrls,NMUDP; type TForm1 = class(TForm) NMUDP1: TNMUDP; EditIP: TEdit; EditPort: TEdit; EditMyTxt: TEdit; MemoReceive: TMemo; BtSend: TButton; BtClear: TButton; BtSave: TButton; StatusBar1: TStatusBar; SaveDialog1: TSaveDialog; procedure BtSendClick(Sender: TObject); procedure NMUDP1DataReceived(Sender: TComponent; NumberBytes: Integer; FromIP: String; Port: Integer); procedure NMUDP1InvalidHost(var handled: Boolean); procedure NMUDP1DataSend(Sender: TObject); procedure FormCreate(Sender: TObject); procedure BtClearClick(Sender: TObject); procedure BtSaveClick(Sender: TObject); procedure EditMyTxtKeyPress(Sender: TObject; var Key: Char); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.BtSendClick(Sender: TObject); var MyStream: TMemoryStream; MySendTxt: String; Iport,icode:integer; Begin Val(EditPort.Text,Iport,icode); if icode<>0 then begin Application.MessageBox('端口必须为数字,请重新输入!','信息',MB_ICONINFORMATION+MB_OK); Exit; end; NMUDP1.RemoteHost := EditIP.Text; {远程主机} NMUDP1.LocalPort:=Iport; {本地端口} NMUDP1.RemotePort := Iport; {远程端口} MySendTxt := EditMyTxt.Text; MyStream := TMemoryStream.Create; {建立流} try MyStream.Write(MySendTxt[1], Length(EditMyTxt.Text));{写数据} NMUDP1.SendStream(MyStream); {发送流} finally MyStream.Free; {释放流} end; end; procedure TForm1.NMUDP1DataReceived(Sender: TComponent; NumberBytes: Integer; FromIP: String; Port: Integer); var MyStream: TMemoryStream; MyReciveTxt: String; begin MyStream := TMemoryStream.Create; {建立流} try NMUDP1.ReadStream(MyStream);{接收流} SetLength(MyReciveTxt,NumberBytes);{NumberBytes为接收到的字节数} MyStream.Read(MyReciveTxt[1],NumberBytes);{读数据} MemoReceive.Lines.Add('接收到来自主机'+FromIP+'的信息:'+MyReciveTxt); finally MyStream.Free; {释放流} end; end; procedure TForm1.NMUDP1InvalidHost(var handled: Boolean); begin Application.MessageBox('对方IP地址不正确,请重新输入!','信息',MB_ICONINFORMATION+MB_OK); end; procedure TForm1.NMUDP1DataSend(Sender: TObject); begin StatusBar1.SimpleText:='信息成功发出!'; end; procedure TForm1.FormCreate(Sender: TObject); begin EditIP.Text:='127.0.0.1'; EditPort.Text:='8868'; BtSend.Caption:='发送'; BtClear.Caption:='清除聊天记录'; BtSave.Caption:='保存聊天记录'; MemoReceive.ScrollBars:=ssBoth; MemoReceive.Clear; EditMyTxt.Text:='在这里输入信息,然后点击发送.'; StatusBar1.SimplePanel:=true; end; procedure TForm1.BtClearClick(Sender: TObject); begin MemoReceive.Clear; end; procedure TForm1.BtSaveClick(Sender: TObject); begin if SaveDialog1.Execute then MemoReceive.Lines.SaveToFile(SaveDialog1.FileName); end; procedure TForm1.EditMyTxtKeyPress(Sender: TObject; var Key: Char); begin if Key=#13 then BtSend.Click; end; end. 上面的程序跟OICQ相比当然差之甚远,因为OICQ利用的是Socket5通信方式。它上线时先从服务器取回好友信息和在线状态,发送超时还会将信息先保存在服务器,等对方下次上线后再发送然后把服务器的备份删除。你可以根据前面学的概念来完善这个程序,比如说再添加一个NMUDP控件来管理在线状态,发送的信息先转换成ASCII码进行与或运行并加上一个头信息,接收方接收信息后先判断信息头正确与否,如果正确才把信息解密显示出来,这样就提高了安全保密性。 另外,UDP协议还有一个很大的好处就是可以广播,就是说处于一个网段的都可以接收到信息而不必指定具体的IP地址。网段一般分A、B、C三类, 1~126.XXX.XXX.XXX (A类网) :广播地址为XXX.255.255.255
如果您对本文有任何疑问或者建议,请到讨论区发表您的意见:
>>
论坛入口 <<
上一页 1 2 3 4 5 6 7 下一页
上一篇:如何把数据库的内容写入到Word文档中? 下一篇:如何用Delphi制作录音程序
【文章评论 】
【收藏本文 】
【推荐好友 】
【打印本文 】
【我要投稿 】 【论坛讨论 】
相关文章:
·如何用Delphi制作录音程序 ·谈Delphi编程中“流”的应用 ·如何把数据库的内容写入到Word文档中? ·从实作标题栏按钮开始浅谈组件的制作 ·“98五笔字型输入法”大批量造词 ·关于Delphi大Bug的更详细的例子 ·不知您是笨蛋,还是我是笨蛋,关于Delphi ·剖析TThread类 ·理解类引用这种类型 ·改良控件-Delphi自带控件Bug的消除
文章评论: (1条)
声明:刊登此文章是为了传递更多信息,文章内容仅供参考,转载请注明出处。