如何实现如 QQ 的文件传输?(100分)

  • 主题发起人 主题发起人 apolloone
  • 开始时间 开始时间
A

apolloone

Unregistered / Unconfirmed
GUEST, unregistred user!
QQ 的文件传输是如何实现的,tcp or udp!
Delphi有相关的控件吗?

一方要自动应答,传输结束后向另一方发通知。
 
关注, 不过好象如果有防火墙就传的有问题了
 
没有防火墙如何传输呢?
 
tcp 的,udp做起来好象很麻烦,有些防火墙截tcp的包,不截udp的,所以用udp发包比tcp实用,
但是实现起来要麻烦许多
 
用TCP把,QQ也是用TCP
 
udp实现起来确实很麻烦,年初写了个udp传文件的程序,有点bug,没发布。
主要是解决包的顺序和丢包,错包问题
可以用发一个包确认收到再发下一个的办法保证顺序正确,当一定时间收不到,
可能是丢包请求重发,如果重发了又收到这个包,就把它扔掉,错包可以用校验
码来解决。有一些标志和算法不太好控制。
其实要是静下心来写,也并不太难我决的。
 
网络上有一个myicq的免费软件,类似qq,但是功能没那么多,但是公布原代码,其中就有
文件传输那一个功能,你可以研究一下
我有一份
要吗?
http://myicq.cosoft.org.cn

---------------
MyICQ是什么?
---------------
MyICQ是一套公开源代码的即时通讯软件,包括服务器端和客户端,可以用于互联网或局域网中。可以运行在Windows或Linux(KDE/Qt)操作系统上,这是Windows的客户端。目前MyICQ的界面完全模仿腾讯的QQ。
总之,如果你崇尚自由,对QQ的越来越多的广告骚扰和名目繁多的收费规则感到深恶痛绝的话,MyICQ绝对是你很好的选择。

------------
联系方式
------------
如果在使用MyICQ的过程中,遇到了什么错误(bug),或有什么新的想法和建议,都可以报告到
http://cosoft.org.cn/projects/myicq 的错误跟踪中,
或者也可以贴到MyICQ的论坛中。同时,我也非常高兴收到大家的来信:

Email: z-yong163@163.com 张勇
 
我要试一试!!
 
ty_unix:
能给我传一个么?我搞毕业设计正在写一个点对点通信的软件。
My Email:zzgyf@yeah.net
谢谢ty_unix
 
我试一试!!
 
有delphi写的icq程序吗?
 
delphi中有啊
TNMStrm;
TNMStrmServ;
主要是这两个,但发送大的文件需要特殊处理。发送小文件很方便
 
那个myicq,好像不是用DELPHI做的,是用VC做的吧
 
如何穿过防火墙呢?呵呵
 
只要有一个QQ是有公共IP的就可以进行传文件了,这个QQ做的比较好!
 
unit Unit1;

interface

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

type
TForm1 = class(TForm)
Label1: TLabel;
Edit1: TEdit;
OpenDialog1: TOpenDialog;
SaveDialog1: TSaveDialog;
NMStrm1: TNMStrm;
NMStrmServ1: TNMStrmServ;
Button1: TButton;
Label2: TLabel;
Edit2: TEdit;
StatusBar1: TStatusBar;
Bevel1: TBevel;
Panel1: TPanel;
procedure Button1Click(Sender: TObject);
procedure NMStrm1Connect(Sender: TObject);
procedure NMStrm1ConnectionFailed(Sender: TObject);
procedure NMStrm1Disconnect(Sender: TObject);
procedure NMStrm1HostResolved(Sender: TComponent);
procedure NMStrm1InvalidHost(var Handled: Boolean);
procedure NMStrm1MessageSent(Sender: TObject);
procedure NMStrm1PacketSent(Sender: TObject);
procedure NMStrm1Status(Sender: TComponent; Status: String);
procedure NMStrmServ1MSG(Sender: TComponent; const sFrom: String;
strm: TStream);
procedure NMStrmServ1ClientContact(Sender: TObject);
procedure NMStrmServ1Status(Sender: TComponent; Status: String);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
MyFStream:TfileStream;
begin
If opendialog1.Execute then
begin
NMStrm1.Host :=edit2.text;//指定主机
NMStrm1.FromName :=edit1.text;
MyFStream:=TfileStream.Create(opendialog1.filename,fmopenRead);//创建流对象
try
NMStrm1.PostIt (MyFStream);
finally
MyFStream.Free ;
end;
end;
end;

procedure TForm1.NMStrm1Connect(Sender: TObject);
begin
Statusbar1.SimpleText :='Connected';
end;

procedure TForm1.NMStrm1ConnectionFailed(Sender: TObject);
begin
Showmessage('connection Failed');
end;

procedure TForm1.NMStrm1Disconnect(Sender: TObject);
begin
If statusbar1<>nil then
Statusbar1.SimpleText :='disconnected';
end;

procedure TForm1.NMStrm1HostResolved(Sender: TComponent);
begin
Statusbar1.SimpleText :='Host Resolved';
end;

procedure TForm1.NMStrm1InvalidHost(var Handled: Boolean);
var
TmpStr:string;
begin
If inputquery('Invalid Host!','Specify a new host:',TmpStr) then
begin
NMStrm1.Host :=TmpStr;
Handled:=true;
end;
end;

procedure TForm1.NMStrm1MessageSent(Sender: TObject);
begin
showmessage('Stream sent');
end;

procedure TForm1.NMStrm1PacketSent(Sender: TObject);
begin
Statusbar1.SimpleText :=Inttostr(NMStrm1.BytesSent)+'of'+Inttostr(NMStrm1.bytestotal)+'sent';
end;

procedure TForm1.NMStrm1Status(Sender: TComponent; Status: String);
begin
if statusbar1<>nil then
Statusbar1.SimpleText :=status;
end;

procedure TForm1.NMStrmServ1MSG(Sender: TComponent; const sFrom: String;
strm: TStream);
var
MyFstream:TfileStream;
begin
if savedialog1.Execute then
begin
MyFstream:=tfileStream.create(savedialog1.filename,fmcreate);
try
MyFstream.copyfrom(strm,strm.size);
finally
MYFstream.free;
end;
end;
end;

procedure TForm1.NMStrmServ1ClientContact(Sender: TObject);
begin
NMStrmserv1.ReportLevel :=Status_Basic;
NMStrmserv1.TimeOut :=90000;//设置超时
Statusbar1.SimpleText :='Client connected';//显示状态
end;

procedure TForm1.NMStrmServ1Status(Sender: TComponent; Status: String);
begin
if Statusbar1<> nil then
statusbar1.SimpleText :=status;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
edit2.text:='';
edit1.text:='';

end;

end.
 
好象有防火墙就会有问题的,除非该防火墙打开允许连接的功能
关注
 
TNMStrm;
TNMStrmServ;
如何实现发送大的文件?总不能把收到的几百兆都放在内存中吧?
 
点对点发当然好解决,多线程的点对点,怎么发啊??
 
后退
顶部