Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 服务器从客户端接收文件时出错?_Java_Sockets - Fatal编程技术网

Java 服务器从客户端接收文件时出错?

Java 服务器从客户端接收文件时出错?,java,sockets,Java,Sockets,我试图将一个文件从客户端发送到服务器,然后服务器响应客户端。服务器已收到文件,但客户端未收到响应 这是我的主代码和客户端代码: public static void main(String[] args) throws IOException { startServer(); startSender(); } public static void startSender() { (new Thread() { @Override publ

我试图将一个文件从客户端发送到服务器,然后服务器响应客户端。服务器已收到文件,但客户端未收到响应

这是我的主代码和客户端代码:

public static void main(String[] args) throws IOException {
    startServer();
    startSender();
}

public static void startSender() {
    (new Thread() {
        @Override
        public void run() {
            try {
                Socket client = new Socket("localhost", 10000);
                ObjectOutputStream oos = new ObjectOutputStream(client.getOutputStream());
                ObjectInputStream ois = new ObjectInputStream(client.getInputStream());

                //sent a file
                FileInputStream fis = new FileInputStream(new File("C:\\Users\\Administrator\\Desktop\\constructor.jpg"));
                byte[] buffer = new byte[1024];
                int length = 0;
                while((length = fis.read(buffer, 0, buffer.length)) > 0){
                    oos.write(buffer, 0, length);
                    oos.flush();
                }
                //response
                String response = (String) ois.readObject();


            } catch (UnknownHostException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }

        }
}).start();
}

服务器:

public static void startServer() {
    (new Thread() {
        @Override
        public void run() {
            ServerSocket server = null;
            Socket client = null;
            ObjectInputStream ois = null;
            ObjectOutputStream oos = null;

                try {
                    server = new ServerSocket(10000);
                    client = server.accept();
                    System.out.println("Connected!");
                    ois = new ObjectInputStream(client.getInputStream());
                    oos = new ObjectOutputStream(client.getOutputStream());

                    //receive the file
                    FileOutputStream fos = new FileOutputStream(new File("E:\\Java\\server\\constructor1.jpg"));
                    byte[] sendBytes = new byte[1024];
                    while(true) {
                        int read =0;
                        read = ois.read(sendBytes);
                        if(read == -1)
                            break;
                        fos.write(sendBytes, 0, read);
                        fos.flush();
                    }
                    //response
                    oos.writeObject("true");
                    oos.flush();

                } catch (IOException e1) {
                    e1.printStackTrace();
                } catch (ClassNotFoundException e) {
                    e.printStackTrace();
                }
        }
    }).start();
}

怎么了?

您必须在ObjectInputStream之前创建ObjectOutputStream。见下文:

ObjectOutputStream oos = new ObjectOutputStream(client.getOutputStream());
ObjectInputStream ois = new ObjectInputStream(client.getInputStream());

这应该可以解决it输出测试的问题。

您的接收器在流结束前一直在读取流,但发送方没有关闭套接字,因此流结束永远不会发生。您需要以某种方式更改发送协议:

  • 在发送文件后关闭套接字以进行输出,但是您只能发送一个文件
  • 在文件之前发送文件长度,在接收器处读取,然后在接收器处只精确读取那么多字节

来源:它不输出测试,他在发送方中按该顺序创建流,这足以克服链接问题中提到的问题,而不是这个问题,否则他不会说服务器收到了文件。一定要读他的问题。@EJP在你不喜欢我的答案之前,请注意我的答案是在OP修改他的问题之前发布的@EJP不仅是我的答案正确,而且我还测试了代码。完全有效。在我阅读的上下文中再次阅读这个问题,并考虑删除你的厌恶。谢谢。@EJP对不起!!!我以前确实修改过我的问题。这个帖子的主人确实解决了我的部分问题。因此,请消除厌恶。谢谢你的回答,现在我的问题解决了。