java DataInputStream read() останавливается и не продолжается
Я хочу отправить и получить объект и подать заказ
клиент -> сервер с помощью ObjectOut(In)putStream
клиент -> строка сервера (имя файла) от DataIn(Out)putStrean writeUTF
клиент -> сервер от BufferedIn(Out)putStream
сервер -> клиент по 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