我正在开展一个学校项目,下面的代码是一个用于构建项目的示例(应该没有任何问题,但不能......)。没有编译错误但是当我使用telnet测试时,以下消息显示:
java.io.StreamCorruptedException: invalid stream header: 56543130
at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:801)
at java.io.ObjectInputStream.<init>(ObjectInputStream.java:298)
at ThreadedDataObjectHandler.run(ThreadedDataObjectServer.java:41)
第41行
ObjectInputStream in =new ObjectInputStream(incoming.getInputStream());
以下是我的代码:
import java.io.*;
import java.net.*;
import java.util.*;
public class ThreadedDataObjectServer {
public static void main(String[] args ) {
try
{ ServerSocket s = new ServerSocket(3000);
for (;;)
{ Socket incoming = s.accept( );
new ThreadedDataObjectHandler(incoming).start();
}
}
catch (Exception e)
{ e.printStackTrace();
}
}
}
class ThreadedDataObjectHandler extends Thread
{
DataObject myObject = null;
private Socket incoming;
private String greeting="Hello!";
public ThreadedDataObjectHandler(Socket incoming)
{
this.incoming = incoming;
}
public void run()
{ try
{
ObjectInputStream in =new ObjectInputStream(incoming.getInputStream());
ObjectOutputStream out =new ObjectOutputStream(incoming.getOutputStream());
myObject = (DataObject)in.readObject();
System.out.println("Message read: " + myObject.getMessage());
myObject.setMessage("Got it!");
System.out.println("Message written: " + myObject.getMessage());
out.writeObject(myObject);
in.close();
out.close();
incoming.close();
}
catch (Exception e)
{ e.printStackTrace();
}
}
}
class DataObject implements Serializable{
protected String message;
public DataObject(){
message="";
}
public void setMessage(String m){
message=m;
}
public String getMessage(){
return message;
}
}
我尝试的是切换语句ObjectInputStream in=...
和ObjectOutputStream out=...
的顺序,但没有运气。请帮忙......谢谢。
答案 0 :(得分:1)
根据我对注释的理解,您尝试使用ObjectInputStream从telnet连接读取对象。
你做不到。如果您打算使用ObjectInputStream,则需要使用ObjectOutputStream编写其他连接程序。
你的telnet客户端并没有真正对Java ObjectOutputStream,ObjectInputStream和Serialization大肆宣传。
所以我尝试使用包装在BufferedReader中的InputStreamReader。
如果您只是想测试连接,只需编写一个小程序,它将连接到您的程序,而不是使用telnet。
答案 1 :(得分:0)
由于您需要DataObject,因此客户端需要发送DataObject。当你使用telnet时,它会连接,但从那里你不能以java Object stream理解的方式发送DataObject。
请参阅http://zerioh.tripod.com/ressources/sockets.html了解服务器/客户端示例。
此外,由于它的一些学校练习试图理解这个概念而不仅仅是复制。