将InputStreamReader与Java一起使用时出错
我试图从客户端向服务器发送一个int值。以下是我正在使用的客户端代码:将InputStreamReader与Java一起使用时出错,java,objectinputstream,Java,Objectinputstream,我试图从客户端向服务器发送一个int值。以下是我正在使用的客户端代码: _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.flu
_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();
服务器代码
try {
input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
ObjectInputStream in = null;
in = new ObjectInputStream(socket.getInputStream());
int ClientNumber= in.readInt();
System.out.println(ClientNumber);
}
但是我得到一个无效的流头错误
无效的流标头:0000002B位于
readStreamHeader(ObjectInputStream.java:781)
位于java.io.ObjectInputStream。(ObjectInputStream.java:278)位于
ServiceRequest.run(ServiceRequest.java:24)位于
Executors$RunnableAdapter.call(Executors.java:439)
位于java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
在java.util.concurrent.FutureTask.run(FutureTask.java:138)中
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
在
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
运行(Thread.java:680)
有人知道是什么导致了错误吗?我的代码设置是否不正确?您正在使用DataOutputStream
进行编写,并使用ObjectInputStream
进行读取。您应该改为使用:
您还应该在这里删除input
:您没有从中读取,而且这看起来像是一个二进制数据流,因此不适合将其视为文本
哦,您应该在
最后
块中关闭输入流。尝试这样更改它
try {
// input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
DataInputStream in = new DataInputStream(socket.getInputStream());
int clientNumber= in.readInt();
System.out.println(clientNumber);
}
它应该会起作用。ObjectInputStream只能读取ObjectOutStream发送的流,它以一个幻数(标题)
0xACED
开头,请参见为什么要创建一个InputStreamReader,将其包装在一个
BufferedReader`中,然后完全忽略它?
try {
// input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
DataInputStream in = new DataInputStream(socket.getInputStream());
int clientNumber= in.readInt();
System.out.println(clientNumber);
}