java.io.StreamCorruptedException:无效类型代码:68
我有一个客户端和服务器,其中有一个ObjectInputStream进出。当我将它用于客户端发送数据时,它确实会这样做。但是当我尝试返回相同的对象类型时,它会给出上面的错误 服务器: 客户工作者:java.io.StreamCorruptedException:无效类型代码:68,java,sockets,objectinputstream,Java,Sockets,Objectinputstream,我有一个客户端和服务器,其中有一个ObjectInputStream进出。当我将它用于客户端发送数据时,它确实会这样做。但是当我尝试返回相同的对象类型时,它会给出上面的错误 服务器: 客户工作者: public void run(){ String line = null; try{ oout = new ObjectOutputStream(client.getOutputStream()); oin = new Object
public void run(){
String line = null;
try{
oout = new ObjectOutputStream(client.getOutputStream());
oin = new ObjectInputStream(client.getInputStream());
in = new BufferedReader(new InputStreamReader(client.getInputStream()));
out = new PrintWriter(client.getOutputStream(), true);
} catch (IOException e) {
System.out.println("in or out failed");
Mud.conn[connnmb]=0;
Mud.sock[connnmb]=null;
}
用于触发发送的命令:
else if (line.startsWith("stats")){
Debug.disPlr(plr);
Mud.sock[conn].oout.writeObject(plr);
}
用于接收对象的节:
newguy=in.readLine();
if (newguy.equals("¥done")){
plr=(Player)oin.readObject();
System.out.println(">"+plr.getPassword());
out.println("¥ok");
}else if (line.equals("¥plr")){
out.println("¥done");
oout.writeObject(plr);
客户:
插座连接:
try{
socket = new Socket("localhost", 42024);
oout = new ObjectOutputStream(socket.getOutputStream());
oin = new ObjectInputStream(socket.getInputStream());
out = new PrintWriter(socket.getOutputStream(),
true);
in = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
connected=1;
//Thread obsock=new Thread(new objectSocket());
//obsock.start();
} catch (UnknownHostException e) {
Styles.writeConsole("Unknown host");
} catch (IOException e) {
Styles.writeConsole("No I/O");
}
发送对象:
newguy=in.readLine();
if (newguy.equals("¥done")){
plr=(Player)oin.readObject();
System.out.println(">"+plr.getPassword());
out.println("¥ok");
}else if (line.equals("¥plr")){
out.println("¥done");
oout.writeObject(plr);
接收plr对象:
if (e.getSource()==btnchar){
out.println("stats");
try {
Object read=oin.readObject();
plr=(Player)read;
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (ClassNotFoundException e1) {
System.out.println("shit");
e1.printStackTrace();
}
cd=new ClassDisplay();
正在发送的播放器对象:
package net.bearfather.Mud;
import java.io.Serializable;
import java.util.ArrayList;
public class Player implements Serializable{
private static final long serialVersionUID = 1L;
private int conn=0;
private Mob mob=null;
private Boolean combat=false;
private Boolean blessed=false;
private Spell[] activesp=new Spell[10];
private int combattype=0;
private int combatspell=0;
private int rec=0;
private String name="blank";
private String password="blank";
private int clss=0;
private String race="none";
private ArrayList<String> inv=new ArrayList<String>();
private int lvl;
private int exp=0;
private int cash=0;
private int lastbaught=0;
private ArrayList<String> abils=new ArrayList<String>();
private ArrayList<String> tabils=new ArrayList<String>();
private ArrayList<String> eabils=new ArrayList<String>();
public ArrayList<String> rtn=new ArrayList<String>();
private int room=1;
private int map=1;
private int mana=0;
private int curmana=0;
private int manargn=0;
//hitpoints
private int maxHps=10;
private int curmaxHps=10;
private int curHps=10;
//defenses and attacks
private int ac=0;
private int cac=0;
private int dr=0;
private int cdr=0;
private int mr=0;
private int cmr=0;
private int att=0;
private int catt=0;
private int sc=0;
private int csc=0;
private int minhit=0;
private int cminhit=0;
private int maxhit=3;
private int cmaxhit=0;
//stats
private int str=0;
private int dex=0;
private int con=0;
private int wis=0;
private int itl=0;
private int chr=0;
package net.bearfather.Mud;
导入java.io.Serializable;
导入java.util.ArrayList;
公共类播放器实现可序列化{
私有静态最终长serialVersionUID=1L;
专用int conn=0;
私有Mob Mob=null;
私有布尔战斗=假;
私有布尔值=假;
私人法术[]activesp=新法术[10];
私有int-combattype=0;
私人int战斗咒语=0;
私有int rec=0;
私有字符串name=“blank”;
私有字符串password=“blank”;
私有int clss=0;
私有字符串race=“无”;
private ArrayList inv=new ArrayList();
私人国际级;
私有int exp=0;
私人int现金=0;
private int lastbaught=0;
私有ArrayList abils=新ArrayList();
private ArrayList tabils=new ArrayList();
private ArrayList eabils=new ArrayList();
public ArrayList rtn=new ArrayList();
私人综合房间=1;
私有int-map=1;
私人智力法力=0;
私有int curmana=0;
私有整数manargn=0;
//致命点
私有整数maxHps=10;
私有int curmaxHps=10;
私有int curHps=10;
//防御和攻击
私有int ac=0;
私有int cac=0;
私有int-dr=0;
私有int cdr=0;
私人int mr=0;
私有整数cmr=0;
专用int att=0;
私有int catt=0;
私有int sc=0;
私有int csc=0;
私有int minhit=0;
私有整数cminhit=0;
私有整数maxhit=3;
私有整数cmaxhit=0;
//统计数据
私有int str=0;
私有int-dex=0;
私有int con=0;
私有int wis=0;
私人国际交易日志=0;
私有int-chr=0;
}
现在我知道我是对象套接字的新手,所以我肯定我错过了这一点。对于两端(服务器、客户端)的输入/输出流,需要使用相同的类型。因此,将代码更改为:
oout = new ObjectOutputStream(client.getOutputStream());
oin = new ObjectInputStream(client.getInputStream());
// REMOVE THIS LINE in = new BufferedReader(new InputStreamReader(client.getInputStream()));
// REMOVE THIS LINE out = new PrintWriter(client.getOutputStream(), true);
卸下另一个输入和输出
及
删除另一个输入和输出,但我一直在为普通字符串使用这两个输入和输出。我应该只使用一个字符串吗?就像我说的,我是个新手,你不能“过度使用”它。每个套接字只有两个流。一个进去,另一个出去。您可以使用一种类型来处理它们(例如DataInputStream/DataOutputStream、ObjectInputStream/ObjectOutputStream等等)。对于您的情况,您可以使用ObjectInputStream/ObjectOutputStream,即使是字符串objectsThank!那是我的问题。我现在对插座有了更多的了解,我会投票给你,但我没有排名:(