Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.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 DataInputStream read()停止,不继续_Java_Sockets_Object_File Io_Datainputstream - Fatal编程技术网

java DataInputStream read()停止,不继续

java DataInputStream read()停止,不继续,java,sockets,object,file-io,datainputstream,Java,Sockets,Object,File Io,Datainputstream,我想发送和接收一个对象和文件的顺序是 客户端->服务器按对象输出(输入)putStream 客户端->服务器字符串(文件名)按数据输入(输出)putStrean writeUTF 客户端->服务器按缓冲区输入(输出)输出流 服务器->客户端按对象输出(输入)putStream 但是,当代码到达3时,编写文件将花费很长时间(我认为…它正在等待),关键代码是 byte[] data = new byte[BUFFER_SIZE]; while ((length = bis.read(data))

我想发送和接收一个对象和文件的顺序是

  • 客户端->服务器按对象输出(输入)putStream

  • 客户端->服务器字符串(文件名)按数据输入(输出)putStrean writeUTF

  • 客户端->服务器按缓冲区输入(输出)输出流

  • 服务器->客户端按对象输出(输入)putStream

  • 但是,当代码到达3时,编写文件将花费很长时间(我认为…它正在等待),关键代码是

    byte[] data = new byte[BUFFER_SIZE];
    while ((length = bis.read(data)) != -1) {
        bos.write(data, 0, length);
        System.out.println(length);
    }
    
    bis(BufferedInputStream).read()
    打印输出长度时不要继续

    4096
    4096
    879
    
    那就等着

    有人知道问题或解决方案是什么吗

    服务器线程

    public void run() {
    
        System.out.println("\n New FileUploadServer thread started");
        msg = (Message) objComm.recvObject(clientSocket);
        System.out.println("server get message");
        if (checkState(msg.getState()))
            System.out.println(clientAddr + " session over");
    
        System.out.println("");
    }
    
    private boolean checkState(int _state) {
        switch (_state) {
            case ST_EXCEL_FILE:
                return receiveExcel();
            default:
                return false;
        }
    }
    
    
    private boolean receiveExcel() {
    
        Message sendMsg = receiveStr();
        System.out.println("receiveStr() success");
        BufferedInputStream bis;
        DataOutputStream dos;
        DataInputStream dis;
        FileOutputStream fos;
        BufferedOutputStream bos;
    
        VoteInfo sendVoteInfo = (VoteInfo) msg.getObj();
    
        try {
            dis = new DataInputStream(clientSocket.getInputStream());
            dos = new DataOutputStream(clientSocket.getOutputStream());
            // check file name extension is "xls" or "xlsx"
            String fName = dis.readUTF();
    
    
            int idx = fName.lastIndexOf(".");
            String extension = fName.substring(idx + 1, fName.length());
            if (!excelFileCheck(extension))
                return false;
    
            dos.writeUTF("read_ok");
            dos.flush();
            System.out.println("File name: " + fName);
            File f = new File(EXCEL_FILE_DIR + fName);
    
            fos = new FileOutputStream(f);
            bos = new BufferedOutputStream(fos);
            bis = new BufferedInputStream(clientSocket.getInputStream());
    
            int length;
            byte[] data = new byte[BUFFER_SIZE];
            while ((length = bis.read(data)) != -1) {
                bos.write(data, 0, length);
                System.out.println(length);
            }
            bos.flush();
            // send success message to web server
            System.out.println("kangji2");
    
            objComm.sendObject(sendMsg, clientSocket);
    
    
            System.out.println("File receive success!");
    
            if (!dataToDB.excelToDB(EXCEL_FILE_DIR + fName, extension)) {
                //delete all db related to this excel file here
                return false;
            } else {
    
    
            }
            bos.close();
            fos.close();
            dis.close();
    
            clientSocket.close();
    
            // send candidates information to DB server
            return makeResult(sendVoteInfo);
    
        } catch (IOException e) {
            System.out.println("ReceiveExcel error");
            e.printStackTrace();
        }
        return false;
    }
    
    
    public class ObjectComm {
    
        private Message receiveMsg = null;
        private ObjectOutputStream out = null;
        private ObjectInputStream in = null;
    
        public Message commObject(Message _sendMsg, Socket _clntSocket) {
    
            if (!_clntSocket.isConnected()) {
                System.out.println("clnt Socket not connected");
                return null;
            }
    
            try {
                out = new ObjectOutputStream(_clntSocket.getOutputStream());
                out.writeObject(_sendMsg);
                out.flush();
    
                System.out.println("kangji1");
                in = new ObjectInputStream(_clntSocket.getInputStream());
                receiveMsg = (Message) in.readObject();
                System.out.println("kangji2");
                return receiveMsg;
            } catch (Exception e) {
                System.out.println("commObject err");
                e.printStackTrace();
                return null;
            }
    
        }
    
        public boolean sendObject(Message _msg, Socket _clntSocket) {
            if (!_clntSocket.isConnected()) {
                System.out.println("clnt Socket not connected");
                return false;
            }
    
            try {
                out = new ObjectOutputStream(_clntSocket.getOutputStream());
                out.writeObject(_msg);
                out.flush();
    
                return true;
            } catch (IOException e) {
                System.out.println("Object comm send err");
                e.printStackTrace();
                return false;
            }
        }
    
        public Message recvObject(Socket _clntSocket) {
            if (!_clntSocket.isConnected()) {
                System.out.println("clnt Socket not connected");
                return null;
            }
    
            try {
                in = new ObjectInputStream(_clntSocket.getInputStream());
                receiveMsg = (Message) in.readObject();
                return receiveMsg;
    
            } catch (Exception e) {
                System.out.println("Object comm recvObject err");
                e.printStackTrace();
                return null;
            }
        }
    
    }
    

    您是否在客户端(发送方端,或与输入流相对的任何位置)关闭了连接?当到达流的末尾时,BufferedInputStream中的read(字节[],int,int)将返回

    • 客户端->服务器按对象输出(输入)putStream
    • 客户端->服务器字符串(文件名)按数据输入(输出)putStrean writeUTF
    • 客户端->服务器按缓冲区输入(输出)输出流
    • 服务器->客户端按对象输出(输入)putStream
    这里东西太多了

    在流堆栈的不同级别上播放流根本不起作用。

    如果要发送对象,请使用
    ObjectInput/OutputStreams
    进行所有操作。按如下方式构建它们:

    new ObjectOutputStream(new BufferedOutputStream(...))
    


    使用
    writeObject()发送对象
    使用
    writeObject()或
    writeUTF()发送字符串通过
    ObjectOutputStream.write()发送字节数组
    并在另一端使用
    ObjectInputStream
    的补充方法。

    我认为如果我关闭缓冲区,那么套接字也会关闭,不是吗?好吧,我在代码中没有看到对BufferedInputStream的close()调用。。事实上你不应该这么做。您的代码需要读取输入流,直到read()返回-1,然后您可以在代码末尾关闭输入流,而不是在从输入流读取字节的过程中。尝试在代码通过输入流读取字节的相反部分添加套接字关闭逻辑,如果我的建议有效,请重试。正如您所说,如果我添加close(),等待就结束了,但问题是close()之后,套接字也关闭了。所以,在close()看起来您与clientSocket连接的客户端发送完数据后,我无法从服务器接收或获取消息,并且什么都没有了。因此,每次代码试图通过read(byte[],int,int)读取字节时,方法都会返回0(零),因为没有可读取的内容,读取实际上被阻止。这就是为什么在40964096879之后你看不到任何数据。正如您所评论的,如果您想继续使用已连接的clientSocket,那么是的,您不应该关闭该套接字。只需更改while条件,如while((长度=bis.read(数据))>0)。。。您可能能够避免当前的问题,尽管您的网络或客户端远程进程可能由于某种原因而被阻塞,并且没有发送任何临时消息。。在这种情况下,即使还有更多字节需要读取,您的读取过程也将完成。您尝试了什么?什么代码?把它编辑成你的问题。
    new ObjectInputStream(new BufferedInputStream(...))