网络传输文件的问题(100分)

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

windofsun

Unregistered / Unconfirmed
GUEST, unregistred user!
现在要做一套文件传输系统,要求通过网络传输文件。具体要求是:
1、文件服务器S的IP固定,各个客户端是拨号上网,IP不固定。
2、所有的文件传输必须经过文件服务器S。
3、如果客户端A想传输文件给B,则A向S发送请求,S通过验证后,A开始上传数据(可能一次要传输几个文件,所以一次上传数据包要可以同时发送几个文件),在传输信息中包含了文件源、文件目的地、文件名等信息。S接收到数据以后,先把文件保存到本地硬盘,解析出文件源和目标地址是B,然后给客户端B的主管发送提示短消息(如何发送短消息暂且不用管),B在接到提示后,连接S,请求验证身份,S通过验证后,从硬盘提取文件,把数据发送给B,B再保存到硬盘。
4、可能有很多个客户端同时连接S
5、客户端程序要相同,而没有发送方和接收方的区别,也就是同时有上传和下载的功能。

这里主要是文件操作和网络传输的问题。我学习JAVA才不过一个星期而已,就要做这东西。各位大侠,帮帮忙!(还好,有C++的基础,语法没有让我太为难)
最好有现成的例子源码给我分析一下。我知道这样不好,但我学JAVA的时间实在太短了!
多谢!
 
第三点中有问题啊,服务器不知道客户端的ip,不能连接到客户段通知客户端的,建议每个
客户端启动后都要主动连接服务器,通知服务器客户端ip,或者是采用常连方式。
其他都比较简单了[:)]
 
第三点是服务器S监听端口,等待目标客户端B的访问(通过短消息提示B的负责人,短消息的实现部分由别人写)
其他比较简单的能否也详细说明一下?能不能给点例子?包括文件操作、网络传输等。我学JAVA才几天[:(](以前是Delphi那嘎达的)
多谢了
 
大侠,帮帮忙!很急!!!
 
简单的很哪,用jsp作就可以了
下载一个smartdownload,再添点其它的东东就行了
 
不行,要求做Application。对于这个,我没有决定权的。
大家帮帮忙啊!真的很急!
 
这么惨啊,那就自己用socket作一个吧
 
procedure TForm1.ClientSocket2Read(Sender: TObject;
Socket: TCustomWinSocket);
var len:integer;
temp:string;
begin
if stStatue=stgetFile then
begin
Len:=Socket.ReceiveLength;
Temp:=Socket.ReceiveText;
filem.Write(PChar(Temp)^,len);
//filem是一个文件流
inc(allLen,len);
if allLen=getfilesize then
//allLen是文件长度,你先传送过来
ShowMessage('文件接受完毕!');

end;

发送部分
const
MAX_LEN=2048;
var
iSen:integer;
//iSen发送出去的长度
iSize:integer;
//文件长度 最好是全局变量
buf:array[1..MAXLEN]of char;
senlen:integer;
//每次应该发送的长度
ret:integer;
//实际发送的文件长度
filen:TFileStream;
//最好是全局变量
iSen:=0;
while iSen<iSizedo

begin
FillChar(buf,MAX_LEN,0);
if iSize-iSen>MAX_LEN then
senlen:=MAX_LEN
else
senLen:=iSize-iSen;
filen.Position:=iSen;
filen.Read(buf,senLen);
ret:=ClientSocket1.Socket.SendBuf(buf,senLen);
inc(iSen,ret);
end;
 
这种OA系统,一般做得像OUTLOOK一样,有需要时接收,发送时上传.
客户端最好不用采用JAVA,用其他工具编写,每次进行FTP上传,将文件传到指定目录,然后发
个消息给JSP网页,JSP程序去处理文件.
 
语言我也是没有决定权的。我本来Delphi已经用的很熟练了,也不想一下转JAVA。但没办法,这是公司的决定,我只有照这做。
 
再问一个问题:如何把任意文件以流的形式输出到Socket?哪位大侠详细举例说明一下?
 
你把任意文件读到文件流里,用我上面的代码不就行了?
 
socket不是有自己的线程吗。
 
TO: 张无忌
是用JAVA实现,不是Delphi
 
JAVA应该和用DELPHI的差不多,就是调用那些成员函数,没别的难
 
在Delphi里,Socket被封装成组件,所以你可以直接在它的事件里面写代码。JAVA完全不同,Socket只是一个普通类,没有现成的事件让你用,也没有ReceiveLength来标识它所接收数据的长度。还有,JAVA里面的IO流有几十种,这也让我这个对Delphi已经非常熟悉,学JAVA不过几天的人非常痛苦,无从下手
 
package test;
import java.net.*;
import java.io.*;
public class test
{
public static void main(String[] args) throws IOException
{
InetAddress addr = InetAddress.getByName(null);
Socket socket = new Socket(addr, 1234);
try
{
BufferedWriter out =new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
out.write("filedata");
}
finally
{
socket.close();
}
}
}
 
TO: hyzou
先谢谢你的回答。我现在的问题主要是:
假设客户端A要上传文件,先把一个文件以流的方式读出来,然后
OutputStream sout = socket.getOutputStream();
通过sout把文件流输出到端口。传输完毕后,发送一个上传结束的标志。
服务器S接收文件
InputStream sin = socket.getInputStream();
通过sin接收数据,并保存到本地。
现在有两个问题:
1、如果采用A上传完毕后发送标志的做法,这个标志也会作为sout的输出,在服务器端会被当做文件的一部分。该如何避免呢?
2、如果不用1的方法,服务器端S如何能知道A已经传输完了呢?它并不知道文件的长度。
 
不用加标志,服务器端inputstream.read,读不到时就传完了
 
顶部