我有一个服务器和多个客户端,并且我试图使服务器线程同时向所有连接的客户端发送文件。奇怪的是,有时文件被正确写入,有时笔记本电脑会发出噪音并且文件是在控制台中编写的,没有创建任何文件。两次试验之间的代码没有做任何更改。有人可以帮我吗?提前谢谢,这是发送服务器线程代码

try
{
    out.println("AcceptFile,");
    FileInputStream fis = new FileInputStream(fn);
    byte[] buffer = new byte[fis.available()];
    fis.read(buffer);
    ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream()) ;
    oos.writeObject(buffer);
    oos.flush();
}
catch(Exception c)
{
    System.err.println("exc" + c);
}


这是客户端线程接收

try
{
    ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
                    byte[] buffer = (byte[])ois.readObject();
                    String pic="copy"+studId+".pdf";
                    System.out.println(pic);
                    FileOutputStream fos = new FileOutputStream(pic);
                    fos.write(buffer);
                    fos.flush();
                    fos.close();
}
catch(Exception e)
{
    System.out.println("Exception writing");
}

最佳答案

我经常看到这是一个反复出现的问题。您不能保证您不希望基础套接字不会刷新。如果是这样,则客户端可以获得部分Object,而ObjectInputStream将引发Exception。

处理它的方法是让服务器通过ByteArrayOutputStream将对象写入中间byte []。然后,您发送一个简单的标头,描述要遵循的字节的长度,然后发送byte []的内容(每次写入后刷新)。在客户端,您可以执行相反的操作:读取简单的标头,以便知道需要多少字节,然后通过ByteArrayInputStream读取到byte []中,然后从那里读取到ObjectInputStream。当然,由于无论如何都只是在写入文件,因此可以跳过客户端的ObjectInputStream,而直接将byte []写入文件。

import java.io.*;

public class junk extends ClassLoader {


  public static void main(String[] args) throws Exception {
    new junk();
  }

  public void marshal(OutputStream socketOutputStream, Object obj)
    throws Exception
  {

    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    ObjectOutputStream oos = new ObjectOutputStream(bos);

    oos.writeObject(obj);

    byte[] bytes = bos.toByteArray();

    DataOutputStream dos = new DataOutputStream(socketOutputStream);

    // header
    dos.writeInt(bytes.length);
    dos.flush();

    dos.write(bytes);
    dos.flush();
  }

  public Object unmarshal(InputStream socketInputStream) throws Exception {

    DataInputStream dis = new DataInputStream(socketInputStream);

    int numToRead = dis.readInt();

    byte[] bytes = new byte[numToRead];

    dis.readFully(bytes);

    ByteArrayInputStream bis = new ByteArrayInputStream(bytes);

    ObjectInputStream ois = new ObjectInputStream(bis);

    return ois.readObject();

  }

}

关于java - 服务器将文件发送到客户端Java,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5797360/

10-11 22:31
查看更多