0

我试图将一个 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.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);
}

但我收到无效的流标头错误。

无效的流标头:在 java.io.ObjectInputStream.(ObjectInputStream.java:278) 在 java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:781) 在 java.util 的 ServiceRequest.run(ServiceRequest.java:24) 的 0000002B。 concurrent.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) 在 java.lang.Thread.run(Thread.java :680)

有谁知道是什么导致了错误?我的代码设置不正确吗?

4

2 回答 2

1

您正在使用 a编写DataOutputStream和使用a阅读ObjectInputStream。您应该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();

你也应该去掉input这里:你不是在读取它,因为这看起来像是一个二进制数据流,把它当作文本是不合适的。

哦,你应该在一个finally块中关闭输入流。

于 2013-04-30T16:17:59.270 回答
0

尝试像这样改变它

try {
             //   input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            DataInputStream in = new DataInputStream(socket.getInputStream());
            int clientNumber= in.readInt();
            System.out.println(clientNumber);
}

它应该工作。ObjectInputStream 只能读取由 ObjectOuputStream 发送的流,它以幻数(标头)开头0xACED,请参阅http://docs.oracle.com/javase/6/docs/platform/serialization/spec/protocol.html

于 2013-04-30T16:22:20.337 回答