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))
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(...))