java DataInputStream read()停止,不要继续


  • 我想发送和接收一个对象和文件,订单是

    1. 客户端->服务器通过ObjectOut(In(putStream

    2. 客户端->服务器字符串(文件名(通过DataIn(Out(putStrean writeUTF

    3. 客户端->服务器通过BufferedIn(Out(putStream

    4. 服务器->客户端通过ObjectOut(In(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(byte[],int,int(将返回。

http://docs.oracle.com/javase/7/docs/api/java/io/BufferedInputStream.html#read(byte[],%20int,%20iint(

  • 客户端->服务器通过ObjectOut(In(putStream
  • client->server String(文件名(by 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的互补方法。

相关内容

  • 没有找到相关文章

最新更新