客户端和客户端传送文件问题。绝对超难,请高手指教。

honesty_aijf_88 2010-03-22 02:01:49
前提 :1 客户端1(浏览器) 连接到服务器,客户端2连接到服务器,
需求:客户端1给客户端2发送文件(不要如下方式实现:客户端1先上传文件到服务器,客户端2下载)要直接在客户端1和客户端2建立socket连接。
提示:我用了Openfire服务器,Openfire服务器内部文件传输时socket实现方式。目前需要解决的问题如是Openfire的API中有有个类是服务发文件的,发文件的方法如下几种
1 void sendFile(File file, String description)
This method handles the stream negotiation process and transmits the file to the remote user.
2 OutputStream sendFile(String fileName, long fileSize, String description)
This method handles the negotiation of the file transfer and the stream, it only returns the created stream after the negotiation has been completed.
3 void sendFile(String fileName, long fileSize, String description, OutgoingFileTransfer.NegotiationProgress progress)
This methods handles the transfer and stream negotiation process.
4 void sendStream(InputStream in, String fileName, long fileSize, String description)
This method handles the stream negotiation process and transmits the file to the remote user.

我用的是第一种,所以需要构造File对象。
如何通过客户端1提交的文件路径(客户端1本地的文件路径)构建File对象?
再看一下第方法参数为流,所以考虑可以通过客户端1发送文件流,但是不知道限制大小不?

这个问题超难,或者有牛人告诉我不能实现(请阐述原因)。我查了很多资料,包括国外的。这个问题好像是第一次有这样的需求。
...全文
153 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
bayougeng 2010-03-22
  • 打赏
  • 举报
回复
URL url = new URL("file",host, fileNameString);

你这样肯定不行的,客户端可能是通过路由器上网,你无法直接与访问你的那台机器取得连接。
除非是被动的。
再说,用户点击上传文件,并不等于共享一个目录给你,仅仅是通过你的80端口得到一个文件上传的通道。
honesty_aijf_88 2010-03-22
  • 打赏
  • 举报
回复
现在终于搞明白了
最后决定采用客户端提交流到服务器,然后服务器把流发送给相应的客户端接收

客户端和客户端直接发送的方式不行

ok结贴
honesty_aijf_88 2010-03-22
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 sun_zhicheng 的回复:]
不用服务器做中转 ???
[/Quote]建立连接肯定需要服务器,连接建立好后,两个客户端之间直接传,此时抛弃服务器了。
sun_zhicheng 2010-03-22
  • 打赏
  • 举报
回复
不用服务器做中转 ???
honesty_aijf_88 2010-03-22
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 bayougeng 的回复:]
用户1点击上传以后,服务器端应该可以得到一个stream,把这个stream定向到用户2那里可以么?问题是用户1上传后,你得通知用户2,并让他接收文件,这样才能获得输出流。
这样的方式不是你说的那种上传-下载的方式,服务器起到了中间管道的作用。
[/Quote]
恩。我初期设计的时候曾这么考虑过的。算是我的第二种实现方式。但是当我查java的API的时候看到File的构造函数中有如下方式:File(URI uri) 通过将给定的 file: URI 转换成一个抽象路径名来创建一个新的 File 实例。
我就尝试用这种方式创建文件。代码如下
String host = request.getRemoteAddr();// 获得发送者的host
// 用远程地址创建File对象
URL url = new URL("file",host, fileNameString);
URI uri = url.toURI();
File file = new File(uri);
return file;
但是抛异常了。。。
当初就是看到这个构造函数诱惑我想到的这种方式。可行吗??
honesty_aijf_88 2010-03-22
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 plghqr 的回复:]
1、Http协议是不是握手协议,请求/返回后,服务器就不知道客户端地址了,你的情况中,服务器不能知道客户端1、客户端2的具体位置,这样的话,客户端1和客户端2之间更不可能知道对方地址,对方的位置都不知道,怎么能实现不通过服务器传送文件呢?
2、浏览器限制操作本地文件,如果客户端2能直接获得客户端1的文件,整个网络就乱套了,就相当于,我可以随时得到别人的机器上的特定文件,譬如,网银的证书什么的;
……
[/Quote]
1我采用了Pushlet(长连接的服务器推送技术)技术,所以服务器可以知道任何一个和它连接的客户端。
2既然可以考虑用服务器中专,那么 客户端1发送流到服务器,然后服务器调用void sendStream(InputStream in, String fileName, long fileSize, String description) 方法传送文件可以吗?限制大小吗?
bayougeng 2010-03-22
  • 打赏
  • 举报
回复
用户1点击上传以后,服务器端应该可以得到一个stream,把这个stream定向到用户2那里可以么?问题是用户1上传后,你得通知用户2,并让他接收文件,这样才能获得输出流。
这样的方式不是你说的那种上传-下载的方式,服务器起到了中间管道的作用。
如果想让用户1和用户2脱离服务器直接传递文件,你可以去找找看web迅雷是怎么做的。
hcjhuanghe11111 2010-03-22
  • 打赏
  • 举报
回复
膜拜中。。。
plghqr 2010-03-22
  • 打赏
  • 举报
回复
1、Http协议是不是握手协议,请求/返回后,服务器就不知道客户端地址了,你的情况中,服务器不能知道客户端1、客户端2的具体位置,这样的话,客户端1和客户端2之间更不可能知道对方地址,对方的位置都不知道,怎么能实现不通过服务器传送文件呢?
2、浏览器限制操作本地文件,如果客户端2能直接获得客户端1的文件,整个网络就乱套了,就相当于,我可以随时得到别人的机器上的特定文件,譬如,网银的证书什么的;
3、方法1,通过服务器中转;
4、方法2,写Ocx,操作本地文件,或者,用Ocx,采用p2p实现,实现最终不通过服务器传送文件,就相当于我们的IM软件中传送文件不需要服务器一样

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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