发布于2024-11-10 22:28 阅读(81) 评论(0) 点赞(28) 收藏(4)
问题是我得到 java.io.StreamCorruptedException:无效类型代码:9E,每次代码都不同。
我有一个客户端-服务器应用程序,当客户端处于上传状态而服务器处于下载状态时就会出现问题。
用户按下用户界面上的按钮,所有选定的文件就会逐一传输到服务器。
这是按钮代码:
try {
_client.setProtocolFiles(_uploadTree.getFiles());
if(_uploadTree.getFiles().getFiles().size() > 0) {
_client.write("iwanttoupload");
} else {
CustomDialog.showInfoDialog("Πρέπει να επιλέξετε αρχεία", "Προσοχή");
}
} catch (Exception e) {
e.printStackTrace();
}
这是客户端的上传状态:
@Override
public void interact(Object theInput) throws Exception {
if(theInput.equals("uploadedsuccessfully")) {
System.out.println("uploadedsuccessfully");
_client.setState(new TranferState(_client));
} else if(theInput.equals("letsgo") || theInput.equals("sendmemore")) {
if(_fileToBeSent < _client.getProtocolFiles().getFiles().size())
sendFiles(theInput);
else
_client.write("iuploadedall");
_fileToBeSent++;
} else if(theInput.equals("idontunderstandyou")) {
_client.setState(new TranferState(_client));
}
}
private void sendFiles(Object theInput) throws Exception {
FileInputStream fis = null;
try {
fis = new FileInputStream(new File(_client.getProtocolFiles().getFiles().get(_fileToBeSent).getPath()));
byte[] buffer = new byte[fis.available()];
fis.read(buffer);
_client.getProtocolFiles().getFiles().get(_fileToBeSent).setFile(buffer);
try {
_client.write(_client.getProtocolFiles().getFiles().get(_fileToBeSent));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch(IOException ex) {
System.out.println(ex.getMessage());
_fileToBeSent++;
interact(theInput);
}
}
这是服务器的下载状态:
@Override
public String reply(Object theInput) {
String outPut = "";
if(theInput.equals("iuploadedall")) {
outPut = "uploadedsuccessfully";
_connection.setConnectionState(new TranferState(_connection));
} else if (theInput.equals("startedupload")) {
outPut = "letsgo";
} else if(theInput instanceof ProtocolFile) {
try {
System.out.println(theInput.toString());
ProtocolFile file = (ProtocolFile)theInput;
FileOutputStream fos = new FileOutputStream("C:\\" + file.getName());
fos.write(file.getFile());
fos.close();
outPut = "sendmemore";
} catch (IOException e) {
e.printStackTrace();
}
} else {
outPut="idontunderstandyou";
_connection.setConnectionState(new TranferState(_connection));
}
return outPut;
}
按照这个顺序一切都很好:
如果用户按下按钮一次并等待上传完成然后再次按下它,则效果很好。如果用户在上传完成之前按下它,我会得到这个异常。
一种快速解决方法是检查用户按下按钮时客户端状态是否为传输状态,否则不执行操作,但我想修复套接字的问题或了解为什么会发生这种情况。我认为当它尝试读取序列化对象时,新上传会发送数据,从而造成混乱。我实施的状态将根据消息避免通信,但消息已发送,因此存在问题。
客户端写入代码:
public void write(Object credentials) throws Exception {
if (credentials != null && _socket !=null && !_socket.isClosed()) {
_oos.writeObject(credentials);
} else {
connect();
_oos.writeObject(_credentials);
_oos.flush();
_oos.writeObject(credentials);
}
_oos.flush();
}
服务器读取代码:
while ((input = ois.readObject()) != null) {
if (_connectionState.getClass().equals(ClosedState.class)) {
break;
}
oos.writeObject(Protocol.processInput(input, _connectionState));
oos.flush();
}
例外情况如下:
while ((input = ois.readObject()) != null)
我怀疑问题在于您在按钮代码中立即向客户端进行了写入:
if(_uploadTree.getFiles().getFiles().size() > 0) {
_client.write("iwanttoupload");
}
如果您遵循在后台线程中处理客户端通信的典型模式,那么您必须仅从该线程写入流。按钮应该只将通知排入队列,该通知将在有机会时由该线程处理。
您看到此错误是因为“iwanttoupload”插入到后台线程正在写入的对象中间,从而破坏了流。
作者:黑洞官方问答小能手
链接:http://www.javaheidong.com/blog/article/693743/2f9cb5d3554fb8501e72/
来源:java黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 java黑洞网 All Rights Reserved 版权所有,并保留所有权利。京ICP备18063182号-2
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!