我是服务器套接字的新手,试图学习如何编写套接字(我已经使用了像winsock这样的套接字的经验,但这是我第一次在java中编写一个套接字)。
这是我不断得到的错误:
Couldn't get I/O for the connection to: 0
java.io.EOFException
at java.io.ObjectInputStream$PeekInputStream.readFully(Unknown Source)
at java.io.ObjectInputStream$BlockDataInputStream.readShort(Unknown Source)
at java.io.ObjectInputStream.readStreamHeader(Unknown Source)
at java.io.ObjectInputStream.<init>(Unknown Source)
这是代码:
public static void main(String args[]) {
ServerSocket MyService = null;
Socket clientSocket = null;
Integer clientNum = 0;
Integer inputID, outputID;
try {
MyService = new ServerSocket(hidden);
} catch (IOException e) {
e.printStackTrace();
}
try {
clientSocket = MyService.accept();
ObjectInputStream input = new ObjectInputStream(clientSocket.getInputStream());
ObjectOutputStream output = new ObjectOutputStream(clientSocket.getOutputStream());
Float inputFloat = null;
Float outputFloat = null;
Protocol protocol = new Protocol();
outputFloat = protocol.processFloatInput(null);
while(true) {
if(input.readObject().getClass().equals(inputFloat.getClass())) {
System.out.println("true");
if ((inputFloat = input.readFloat()) != null) {
outputFloat = protocol.processFloatInput(inputFloat);
output.writeObject(outputFloat);
System.out.println("Float value = " + inputFloat);
}
input.close();
output.flush();
output.close();
}
if(input.readObject().getClass().equals(Integer.TYPE)) {
if ((inputID = input.readInt()) != null) {
outputID = protocol.processIntegerInput(inputID);
output.writeObject(inputID);
System.out.println("Client " + outputID + " connected.");
}
input.close();
output.flush();
output.close();
}
}
} catch (UnknownHostException e) {
System.err.println("Don't know about host: hostname");
} catch (IOException e) {
//Error printed
System.err.println("Couldn't get I/O for the connection to: " + clientNum);
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
};
在过去的测试中,我能够连接到服务器,但由于我想在操作之前检查输入数据类型,我得到了这个。
感谢您的帮助:)
答案 0 :(得分:0)
EOFException只是意味着你到达了流的末尾。这很正常。
你的问题是你为每个写的对象读了两次:一次得到它的类,然后再次得到对象。你没有再次得到同一个对象,你得到了下一个对象,所以你最终会用完。
你需要将readObject()的结果存储在一个变量中,然后测试它的类,然后适当地转换它。