[英]Error while using InputStreamReader with Java
I tried to send an int value from the client to the server. 我尝试将int值从客户端发送到服务器。 This is the client code that I'm using below:
这是我在下面使用的客户端代码:
_port = 8071;
_socket = new Socket("localhost", _port);
Random rand = new Random();
int n = rand.nextInt(50) + 1;
DataOutputStream dos = new DataOutputStream(_socket.getOutputStream());
dos.writeInt(n);
dos.flush();
Server Code 服务器代码
try {
input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
ObjectInputStream in = null;
in = new ObjectInputStream(socket.getInputStream());
int ClientNumber= in.readInt();
System.out.println(ClientNumber);
}
but I am getting an invalid stream header error. 但我收到无效的流头错误。
invalid stream header: 0000002B at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:781) at java.io.ObjectInputStream.(ObjectInputStream.java:278) at ServiceRequest.run(ServiceRequest.java:24) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:439) at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) at java.util.concurrent.FutureTask.run(FutureTask.java:138) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918) at java.lang.Thread.run(Thread.java:680)
无效的流标头:java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:781)处0000002B,java.io.ObjectInputStream。(ObjectInputStream.java:278)处ServiceRequest.run(ServiceRequest.java:24)处java.util。并发java.util.concurrent.FutureTask $ Sync.innerRun(FutureTask.java:303)处的java.util.concurrent.FutureTask.run(FutureTask.java:138)处的Executors $ RunnableAdapter.call(Executors.java:439)在java.util.concurrent.ThreadPoolExecutor $ Worker.runTask(ThreadPoolExecutor.java:895)在java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:918)在java.lang.Thread.run(Thread.java) :680)
Does anyone know what is causing the error? 有谁知道是什么原因引起的错误? Is my code setup improperly?
我的代码设置不正确吗?
You're writing using a DataOutputStream
and reading using an ObjectInputStream
. 您正在使用
DataOutputStream
编写,并使用ObjectInputStream
读取 。 You should be using DataInputStream
instead: 您应该改用
DataInputStream
:
// Note declaration and assignment in a single statement. There's no point in
// making it null first.
DataInputStream in = new DataInputStream(socket.getInputStream());
// Note use of camelCase for variable name
int clientNumber = in.readInt();
You should also get rid of input
here: you're not reading from it, and as this looks like it's a stream of binary data, it's inappropriate to treat it as text. 您还应该在这里摆脱
input
:您不是从中读取数据,而且看起来像是二进制数据流,因此将其视为文本是不合适的。
Oh, and you should be closing the input stream in a finally
block. 哦,您应该在
finally
块中关闭输入流。
try to change it like this 尝试像这样改变它
try {
// input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
DataInputStream in = new DataInputStream(socket.getInputStream());
int clientNumber= in.readInt();
System.out.println(clientNumber);
}
it should work. 它应该工作。 ObjectInputStream can read only streams sent by ObjectOuputStream, it starts with a magic number (header)
0xACED
, see http://docs.oracle.com/javase/6/docs/platform/serialization/spec/protocol.html ObjectInputStream只能读取由ObjectOuputStream发送的流,它以魔术数字(标头)
0xACED
,请参见http://docs.oracle.com/javase/6/docs/platform/serialization/spec/protocol.html
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.