想做一个P2P点对点文件交换软件,大家帮忙提供一些资料......关于QQ等等(300分)

  • 主题发起人 主题发起人 xdzhan
  • 开始时间 开始时间
X

xdzhan

Unregistered / Unconfirmed
GUEST, unregistred user!
还有一些问题,如对中心服务器的要求?如何实现不通过中心服务器交换资料?能否实现没有中心服务器的
QQ即使讯息聊天工具,有无可行性?希望大家提供一些网址,资料等等!谢谢了[:)]
 
既然是P2P的交换程序,那就一定是没有中心服务器的了,为什么还说要中心服务器呢?
其实中心服务器的作用就是维护一个全局的用户列表,在登录的时候能获得列表用户的
IP地址。在实际传输中,既然已经拿到了对方的IP地址,就可以直接进行传输了,没必
要经过中心服务器了。
在局域网内部我有一个用UDP做的不用中心服务器的多人聊天程序,其实这样的程序网
上也很多。但是到了广域网上面,许多用户是拨号或走代理的,如果没有中心服务器的
话互相之间的寻址都变的很困难。
 
这样的程序在很多网站都找的到的。
freeicq你可以看看。
 
呵,如果有资料也发一分给我??谢谢
 
如果是内部网,可以不通过服务器的,广播就行了
上internet好象就比较困难了
 
你要的就是一个点对点的Socket通信例程,Delphi6目录下的/Demos/Internet/Chat
就是你要的。
只要能通过TCP/IP协议连接两台计算机,绑定了服务端和客户端的地址和端口号就可以通信了。
 
你可以看一下以前的帖子呀,有源代码的,况且都重复过好多次了
我再把别人的回复转贴一次吧:
林沐 (2001-05-03 15:21:00)
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ScktComp, StdCtrls;

type
TCon = record
FileName : String;
TotalSize : Integer;
Status : Integer;
end;

PCON = ^TCON;

TForm1 = class(TForm)
SS: TServerSocket;
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure SSClientConnect(Sender: TObject; Socket: TCustomWinSocket);
procedure SSClientRead(Sender: TObject; Socket: TCustomWinSocket);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

uses Unit2;

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
SS.Port := 9000;
SS.Active := True;
end;

procedure TForm1.SSClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
var c : pcon;
begin

c :=new(pcon);
c.FileName := '';
c.TotalSize := 0 ;
c.Status := 0;
Socket.Data := c;
Socket.SendText('已经连接,请输入UPLOAD FILENAME SIZE'#13#10);

end;

procedure TForm1.SSClientRead(Sender: TObject; Socket: TCustomWinSocket);
var C : PCON;
cmd:String;
Buffer : pointer;
nRetr : integer;
fs : TFileStream;
const bufferSize = 1024 ;

begin
C:= Socket.Data ;
case c.Status of
0 :
begin
cmd := trim(Socket.ReceiveText) ;

if Pos('UPLOAD ',uppercase(cmd)) > 0 then
begin
c.FileName := trim(Copy(cmd,Pos(' ',cmd)+1,Length(cmd)));
c.TotalSize := StrToInt(Copy(c.FileName,Pos(' ',c.FileName)+1,Length(c.FileName)));
c.FileName := trim(Copy(c.FileName,1,Pos(' ',c.FileName)));
c.Status := 1;
Socket.Data := C;
Socket.SendText('you can send File !'#13#10);
end;
end;
1 : begin
GetMem(Buffer,BufferSize);
nRetr := Socket.ReceiveBuf(Buffer^,BufferSize);

if not FIleExists('c:/'+c.FileName) then
begin
fs :=TFileStream.Create('c:/'+c.FileName,fmCreate or fmShareDenyNone);
fs.Seek(0,soFromBeginning);
end
else
begin
fs :=TFileStream.Create('c:/'+c.FileName,fmOpenWrite or fmShareDenyNone);
fs.Seek(0,soFromEnd);
end;

fs.WriteBuffer(Buffer^,nRetr);

fs.Destroy;
FreeMem(Buffer);
end;
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Form2.Show;
end;

end.





<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
unit Unit2;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ScktComp;

type
TForm2 = class(TForm)
CS: TClientSocket;
OpenDialog1: TOpenDialog;
Memo1: TMemo;
Button1: TButton;
Edit1: TEdit;
Button2: TButton;
SendCommand: TButton;
Label1: TLabel;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure SendCommandClick(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure CSRead(Sender: TObject; Socket: TCustomWinSocket);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form2: TForm2;

implementation

{$R *.DFM}
function GetFileSize(const FileName: string):integer;
var f : TFileStream;
begin
f := TFileStream.Create(FileName,fmOpenRead or fmShareDenyNone);
Result :=f.Size;
F.Free;
end;
procedure TForm2.Button1Click(Sender: TObject);
begin
with OpenDialog1 do
begin
Execute;
if FileName <> '' then
begin
Edit1.Text := 'UPLOAD '+ ExtractFileName(FileName) +' '+Inttostr(GetFileSize(FileName));
Label1.Caption := FileName;
cs.Socket.SendText(edit1.Text);
end;
end;
end;

procedure TForm2.Button2Click(Sender: TObject);
begin
CS.Active := True;

end;

procedure TForm2.SendCommandClick(Sender: TObject);
var fs : TFileStream;
Buf : pointer;

begin
//CS.Socket.SendText(Edit1.Text+#13#10);
//Memo1.Lines.Add();
fs := TFileStream.Create(Label1.Caption ,fmOpenRead or fmShareDenyNone);

GetMem(Buf,fs.Size);
fs.Seek(0,soFromBeginning);

fs.ReadBuffer(Buf^,fs.Size);

memo1.Lines.Add('has send : '+inttostr(Cs.Socket.SendBuf(Buf^,fs.Size)));

end;

procedure TForm2.Button3Click(Sender: TObject);
begin
cs.Close;
end;

procedure TForm2.CSRead(Sender: TObject; Socket: TCustomWinSocket);
begin

Memo1.Lines.add(socket.receiveText);

end;

end.


林沐 (2001-05-03 15:23:00)
注:上面代码来自唐晓锋 。



 
使用stream控件就可以了
 
http://www.ccidnet.com/soft/topic//2002/03/26/100_232.html
这个网站上就有好几p2p的软件下载,何必自已做。
 
国内的workslink还是不错的
 
如果文件不大就用delphi自带的udp控间就可以搞定,如果文件很大,就用winsock那个控间吧,可以
保证传输的正确,这方面的东西太多了,找两个黑客软件的源代码,就可以高定
 
p2p软件中《PP点点通》还是比较好的,不光使用比WORKSLINK方便多了,而且现在用户也很多了
通讯速度也不错,大有后来居上的气势。
 
有没高手能写个P2P 专用控件?
 
晕,我想写,但写不来:)
 
我开始也想写一个类似的软件,我写了一个多线程的文件传输部件,调试后没有什么问题,
但是要做P2P,需要很大的精力,不是一天两天就可以做好的,考虑的因素很多。所以本人
放弃了:(,如果有什么需要我帮忙的,我会尽力的,
还有我认为如何稳定的传输数据是P2P软件的核心部分。一定要在这个方面下工夫
 
确实是有p2p控件,也叫P2P。不过有很多BUG。
我现在写的程序有点像PP点点通,不过文件交换以及聊天只是程序中的基本功能,而且已经
完成(文件传输支持断点续传)。程序使用的是Http协议,但不支持Sock5代理,不知道大家
能不能帮助解决这个问题!!!
 
真的 P2P 控件, 是能穿过网关的那种?  
  6b6@21cn.com

小生有礼了。。。。
 
zwh:
能发一份给我么?先谢过。
 
后退
顶部