日期:2014-05-20  浏览次数:20724 次

利用Socket在局域网实现服务器向客户端发送文件夹
我想在局域网里实现服务器向客户端发送文件夹
第一个问题:是应该用ObjectInputStream和ObjectOutputStream序列化发送和反序列化读取保存数据的byte[]数组对象好呢还是用DataInputStream和DataOutputStream好?
第二个问题:每当传送完一个文件后,是应该关闭流呢还是发送一个结束标记?

我是一个菜鸟,试了很多中方法都不行。
各位路过的朋友,帮帮小弟吧。
我这样想的:
服务器端:
Socket serverSockt;
FileInputStream fis;

DataInputStream dis;或ObjectInputStream
DataOutputStream dos;或ObjectOutputStream
客户端同上。

如果有愿意发代码的,请发我邮箱329674964@qq.com
谢谢各位了。
socket

------解决方案--------------------
发文件夹的话你得自己设计协议了,没有一句话可以搞定的
Stream当然是用Data,更灵活
第二个问题要看你协议怎么设计了,一般是不关闭流比较好
------解决方案--------------------
协议就是收发数据的方式,并不是代码。
比如你可以指定一个协议,规定你的客户端和服务器端交换数据的基本单元是“消息”,本质是一串字节,只不过这串字节有自己的格式。
比如:{ int length, byte type, byte[] data } 这是最基本的构造。服务器端写入的时候就按照这个顺序分别序列化消息长度,消息类型和消息内容。消息类型你自己定义。客户端读取的时候可以这样(这里用伪代码)
int length = socketChannel.readInt();
byte messageType = socketChannel.readByte();
byte[] data = new byte[length];
socketChannel.readByteArray(data, length);
switch (messageType) {
  case 1:
    processType1Data(data);
    break;
  case 2:
    processType2Data(data);
    break;
  default:
    throw new RuntimeException("Received data type not defined");
}

假设这里的readInt和readByte是从输入流读取一个int或byte,readByteArray是读取指定长度(length)的byte[]。相关的API都可以在nio.SocketChannel中找到,具体实现当然不一样,这个就要你自己去研究了。