TCP可以实现两个不同局域网间传送大文件吗?(50分)

  • 主题发起人 主题发起人 wangwpf
  • 开始时间 开始时间
W

wangwpf

Unregistered / Unconfirmed
GUEST, unregistred user!
我现在要做一个OA系统,其中需要进行文件互传,我听说UDP在知道对方IP与端口后可以畅通无阻的通过两个不同的局域网或通过internet相连的两个不同的局域网!所以我打算用delphi中的idUDPClient下idUDPServer组件来做,可是发现用UDP的话,需要对文件进行分块,等到达对方后再重新组块,我不太清楚如何实现文件分块与文件组块。如果无法实现的话,那用TCP的话在知道对方的IP与端口(象QQ似的通过中间服务器来动态获得对方IP与端口)后是否可以实现在通过internet互联的两个不同局域网间的传输?

1、用UDP传输,如何实现文件的分块与组块?
2、用TCP在获得对方IP与端口后能否实现 通过internet互联的两个不同局域网间互传大文件?

我该怎么在流中加入一些我的参数信息???
我又该如何从流中剔除我所加入的参数信息??

比如流中现已有我要传输的4K信息了,可是我要把这是第几块,还是这是什么类型的信息这类参数也要传过去,应该如何把这些参数信息加入呢?到了对方后,又不能把参数信息也写进文件,所以要剔除参数,这个剔除又如何实现呢??

还有idUDPClient这个组件有一个receivestring()这个方法,上面的代码如它来做同步如:
》》 sRe:=SendUdp.ReceiveString;//等对方回复,同步

我想知道ReciveString()所收到的信息是对方自动发回来的确认信息还是编程在让对方用send()发回来的信息呢?
比如:
client:

idUDPClient.Send('sfjslkf');
str:=idUDPClient.ReciveString();

Server:

不调用Send()方法

这种情况下Client的Recivestring()方法还能是到对方的反回值吗??
 
可以不用 UDP
用 TCP
参考 FTP 协议

用UDP 你可以参考 XModem 之类的协议。
把数据分包:如
每个包的格式如下:
<SOH><BLK><255-BLK><1024 Byte Data><cksum>

每一个字节为 SOH 同步字节表示包的开始
每二个字节为包号从 1 开始
第三个字节为 255- 包号 用于检查是否从错。
然后是 1024 个文件数据。
最后是一个累加和校验字节
最后一个包不足 1024 用 ^Z 填充。

接收到是 : 正确回应 ACK
不正确回应 NAK

最后一个包发完后 发送一个 EOT

如果接收端取消时发送 CAN

以上是 XModem 协议
SOH -- 01H
EOT -- 04H
ACK -- 06H
NAK -- 15H
CAN -- 18H
^Z --1AH

你自己再想想。关键是你要自己写作一个协议。

再给你说说 FTP 协议吧:
FTP协议分为两个通道,两个通道都是 TCP 连接
平时只有一个命令通道
在发送数据时监时再开通一个数据通道。
具体一下也说不清
给你个网址上面有比较具体的说明:
http://www.longen.org/protocol.htm
 
QSmile,多谢你的回帖,现在思路我已经有了,现在的问题是我对winsock,idudpclient,idudpserver这些网络组件不是很了解,在网上又很难到到indy组件的中文说明,所以我很想本个源程序来看看。
 
给个邮箱发给你
 
大哥:给小弟一份吧!我现在也在作远程传输方面的。
mail:arwin@126.com
 
我的邮箱是
wangwpf@163.com
 
发给你了
不好意思,中午有事走了
 
你给我的这个程序不行,不是我想要的,我种单个文件的整体发送我已经会了,我现在主要是不会文件的分块传送,你有这方面的源码吗??
 
idUDpClient的ReceiveString()方法如何使用呢??
怎么用他来做客户端与服务器之间的同步??
 
能不能给我也发一份。我很感兴趣
e-mail:yzy@cisri.com.cn
 
给你个源码.看看IDUdpClient 和IDUdpServer 是怎么通信的.
一.客户端

procedure TUDPMainForm.SendButtonClick(Sender: TObject);
var
MessageID: Integer;
ThisMessage: String;
ReceivedString: String;
begin
MessageID := Random(MAXINT);
ThisMessage := 'Message: ' + IntToStr(MessageID);
UDPMemo.Lines.Add('Sending ' + ThisMessage);
UDPClient.Send(ThisMessage);
ReceivedString := UDPClient.ReceiveString();
if ReceivedString = '' then
UDPMemo.Lines.Add('No response received from the server after ' + IntToStr(UDPClient.ReceiveTimeout) + ' millseconds.')
else
UDPMemo.Lines.Add('Received: ' + ReceivedString)
end;

二. 服务器端:


procedure TUDPMainForm.UDPServerUDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle);
var
DataStringStream: TStringStream;
s: String;
begin
DataStringStream := TStringStream.Create('');
try
DataStringStream.CopyFrom(AData, AData.Size);
UDPMemo.Lines.Add('Received "' + DataStringStream.DataString + '" from ' + ABinding.PeerIP + ' on port ' + IntToStr(ABinding.PeerPort));
s := 'Replied from ' + UDPServer.LocalName + ' to "' + DataStringStream.DataString + '"';
ABinding.SendTo(ABinding.PeerIP, ABinding.PeerPort, s[1], Length(s));
finally
DataStringStream.Free;
end;
end;

看对你有没有用.
 
各位前辈,我也想问这样的一个问题 ,不过是用C++builder做的,思路是:服务器端-公网-代理服务器-内网-客户端,我想问问各位前辈,它们是怎样传输的,用了什么控件,我用的是单播的NMMSG和NMMSGCSERVER控件,但知道一个局域网的IP(就是代理服务器的IP)是不行的啊,该怎么办,还望赐教!
 
后退
顶部