java DataInputStream read() останавливается и не продолжается

  • Я хочу отправить и получить объект и подать заказ

    1. клиент -> сервер с помощью ObjectOut(In)putStream

    2. клиент -> строка сервера (имя файла) от DataIn(Out)putStrean writeUTF

    3. клиент -> сервер от BufferedIn(Out)putStream

    4. сервер -> клиент по ObjectOut(In)putStream

    но когда код достигает 3, запись файла занимает вечность (я думаю... он ждет), критический код

    /////////////////////////////////////////////

    байт [] данные = новый байт [BUFFER_SIZE];

    while ((length = bis.read (data))! = -1) {

    bos.write (data, 0, length);

    System.out.println(length);
    

    }

    ///////////////////////////////////////////////

    bis (BufferedInputStream). read () не продолжаются, когда я печатаю длину 4096 4096 879

    тогда просто подожди...

    есть кто-нибудь, кто знает в чем проблема или решение?

Blockquote

////server thread

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;
        }
    }

}

2 ответа

  • клиент -> сервер с помощью ObjectOut(In)putStream
  • клиент -> строка сервера (имя файла) от DataIn(Out)putStrean writeUTF
  • клиент -> сервер от BufferedIn(Out)putStream
  • сервер -> клиент по ObjectOut(In)putStream

Слишком много вещей здесь.

Игра с потоками на разных уровнях вашего стека потоков просто не работает.

Если вы хотите отправить объекты, используйте ObjectInput/OutputStreams для всего Построить их следующим образом:

new ObjectOutputStream(new BufferedOutputStream(...))

а также

new ObjectInputStream(new BufferedInputStream(...))

Отправить объекты с writeObject(); отправить строки с writeObject() или же writeUTF(); отправлять байтовые массивы через ObjectOutputStream.write(); и использовать дополнительные методы ObjectInputStream на другом конце.

Вы закрывали соединение на стороне клиента (на стороне отправителя или где-либо напротив вашего входного потока)? read(byte[], int, int) в BufferedInputStream вернется, когда будет достигнут конец потока.

http://docs.oracle.com/javase/7/docs/api/java/io/BufferedInputStream.html

Другие вопросы по тегам