里面的关于udp包传送程序有问题,请指教

flyskyboy 2001-04-27 02:52:00
我是一个初学Delphi的,知道Delphi功能强大,但下边的udp包传送有问题,编译通过,单不能传送。请高手指教。

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComCtrls, StdCtrls, Psock, NMSTRM;

type
TForm1 = class(TForm)
NMStrm1: TNMStrm;
NMStrmServ1: TNMStrmServ;
OpenDialog1: TOpenDialog;
SaveDialog1: TSaveDialog;
Label1: TLabel;
Edit1: TEdit;
Button1: TButton;
Button2: TButton;
StatusBar1: TStatusBar;
ProgressBar1: TProgressBar;
procedure NMStrm1Connect(Sender: TObject);
procedure NMStrm1Disconnect(Sender: TObject);
procedure NMStrm1MessageSent(Sender: TObject);
procedure NMStrm1PacketSent(Sender: TObject);
procedure NMStrm1Status(Sender: TComponent; Status: String);
procedure NMStrmServ1ClientContact(Sender: TObject);
procedure NMStrmServ1MSG(Sender: TComponent; const sFrom: String;
strm: TStream);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.NMStrm1Connect(Sender: TObject);
begin
statusbar1.Panels[0].Text :='正在连接';
end;

procedure TForm1.NMStrm1Disconnect(Sender: TObject);
begin
if statusbar1.Panels<>nil then
statusbar1.panels[0].text:='断开!';
end;

procedure TForm1.NMStrm1MessageSent(Sender: TObject);
begin
if statusbar1.Panels <>nil then
statusbar1.panels[0].text:='发送完毕!'
end;

procedure TForm1.NMStrm1PacketSent(Sender: TObject);
begin
progressbar1.Max :=nmstrm1.BytesTotal;
progressbar1.Min:=0;
progressbar1.Position :=nmstrm1.BytesSent;
end;

procedure TForm1.NMStrm1Status(Sender: TComponent; Status: String);
begin
if statusbar1<>nil then
statusbar1.Panels[0].Text :=nmstrm1.Status;
end;

procedure TForm1.NMStrmServ1ClientContact(Sender: TObject);
begin
NMStrmServ1.ReportLevel := Status_Basic;
NMStrmServ1.TimeOut := 90000;
StatusBar1.panels[0].text := '正在连接';
end;

procedure TForm1.NMStrmServ1MSG(Sender: TComponent; const sFrom: String;
strm: TStream);
var
MyFStream: TFileStream;
begin
if statusbar1.Panels <>nil then
statusbar1.panels[0].text:='收到来自于'+copy(sfrom,0,length(sfrom)-3)+'的一个文件!';
MyFStream := TFileStream.Create('.\tmp', fmCreate);
try
MyFStream.CopyFrom(strm, strm.size);
finally
MYFStream.Free;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
filename:string;
fstrstrm:tfilestream;

begin
if opendialog1.Execute then
begin
filename:=opendialog1.FileName;
fstrstrm:=tfilestream.Create(filename,fmopenread);
nmstrm1.Host :=edit1.text;
try
nmstrm1.PostIt(fstrstrm);
finally
nmstrm1.Free;
end;
end;
end;
end.

...全文
55 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
flyskyboy 2001-04-27
  • 打赏
  • 举报
回复
care
flyskyboy 2001-04-27
  • 打赏
  • 举报
回复
给分了!!!
这两天下了一个使用UDP传输目录内文件的程序,发出来给大家一起看看,共同进步。有问题指教。 由于udp比较厉害,因此使用了自定义的内部协议,进行双方的确认。 程序跑起来后,看网络状况,有时候会一卡一卡的。 以下是程序说明: * 本程序集成了数据导出端(服务器端)和数据导入端(客户端),使用UDP进行文件传递 * 服务器端的文件来源目录,见Tools中SOURCEPATH的设置 * 客户端的文件保存目录,见Tools中DESTINATIONPATH的设置,可以根据自己需要进行调整 * * 由于UDP存在丢问题,因此Server和Client的通讯需要来回进行确认,协议头如下: * 1. "55 aa 99 01",表示客户端发起广播求,求服务器响应 * 2. "55 aa 99 02 + 服务器的设备名称",表示服务器接收到广播后,响应客户端求,把此指定IP发送客户端(此指定IP地址可以UDP广播信息中获取) * 3. "55 aa 99 03",表示客户端接收到服务器的响应,接着向服务器指定IP求:需要传递的文件总数目和文件总容量(单位为KB) * 4. "55 aa 99 04 + 4字节文件总数目和4字节的文件总容量",表示服务器接收到客户端的0x03求,统计SOURCEPATH中的所有文件数目和文件总容量,发送指定IP地址的客户端 * 5. "55 aa 99 05",客户端接收到文件总数目和文件总容量,求服务器发送文件具体内容 * 6. "55 aa 99 10 + 文件名称",服务器发送文件名称 * 7. "55 aa 99 11",客户端响应,表示接收到服务器发送的0x10 * 8. "55 aa 99 12+文件内容",服务器端发送具体文件内容 * 9. "55 aa 99 13",客户端响应,表示接收到服务器发送的0x12 * 10."55 aa 99 14",服务端高速客户端发送完毕 * * 注意:服务器发送0x10后,收到客户端的0x11响应,将把文件具体内容拆分成N个0x12,每个的大小见Tools.byteSize的设置,目前设置为10K, * 服务器没收到一个0x13响应,才能继续发下一个0x12,已放置UDP的丢,另外每个0x12最多发送10次而无0x13的响应,则发送进程结束,界面提示 * * 本程序已经封装好,调用见TransportFilesActivity.java文件

5,930

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧