簡體   English   中英

objectInputStream.readObject()引發異常java.io.OptionalDataException

[英]objectInputStream.readObject() throws exception java.io.OptionalDataException

有人可以解決這個問題。 使用JDK 1.8,我試圖使用Sockets在Java中構建一個非常簡單的聊天應用程序。 在我的客戶端類中,只要下一行執行Message returnMessage =(Message)objectInputStream.readObject(); 它引發異常。 線程“主”中的異常java.io.OptionalDataException

我只將Message類型的對象寫到流中,並讀取Message類型的對象,因為我寫過一次,所以我認為在順序讀取它們時我沒有做任何錯誤。

問:還請讓我知道調試此類應用程序的最佳方法是什么,在運行客戶端時如何在服務器中達到斷點?

客戶

package com.company;

import sun.misc.SharedSecrets;

import java.io.*;
import java.net.Socket;
import java.net.UnknownHostException;

public class Client {
    public static void main(String[] args) throws UnknownHostException, IOException, ClassNotFoundException{

            Socket socket = new Socket("localhost", Server.PORT);

            ObjectOutputStream objectOutputStream = new ObjectOutputStream(socket.getOutputStream());
            ObjectInputStream objectInputStream = new ObjectInputStream(socket.getInputStream());

            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
            String readerInput = bufferedReader.readLine();
            String[] readerInputTokens = readerInput.split("\u0020");

            if(readerInputTokens.length != 2) {
                System.out.println("Usage: Client <integer> <integer>");
            } else {
                Integer firstNumber = Integer.decode(readerInputTokens[0]);
                Integer secondNumber = Integer.decode(readerInputTokens[1]);

                Message message = new Message(firstNumber, secondNumber);

                objectOutputStream.writeObject(message);


                System.out.println("Reading Object .... ");
                Message returnMessage = (Message) objectInputStream.readObject();

                System.out.println(returnMessage.getResult());

                socket.close();
            }
    }

    public static boolean isInteger(String value) {
        boolean returnValue = true;
        try{Integer.parseInt(value);}
        catch (Exception ex){ returnValue = false; }
        return returnValue;
    }
}

服務器

package com.company;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;


public class Server {
    public final static int PORT = 4446;
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        new Server().runServer();
    }

    public void runServer() throws IOException, ClassNotFoundException {

        ServerSocket serverSocket = new ServerSocket(PORT);
        System.out.println("Server up & ready for connections ...");

        // This while loop is necessary to make this server able to continuously in listning mode
        // So that whenever a client tries to connect, it let it connect.
        while (true){
            Socket socket = serverSocket.accept(); // Server is ready to accept connectiosn;.

            // Initialize Server Thread.
            new ServerThread(socket).start();
        }
    }
}

服務器線程

package com.company;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;

public class ServerThread extends Thread {
    private Socket socket = null;
    ServerThread(Socket socket){
        this.socket = socket;
    }

    public void run() {

        try {

            ObjectOutputStream objectOutputStream = new ObjectOutputStream(socket.getOutputStream());
            objectOutputStream.writeChars("\n");
            objectOutputStream.flush();

            ObjectInputStream objectInputStream = new ObjectInputStream(socket.getInputStream());

            Message message = (Message) objectInputStream.readObject();
            multiplyNumbers(message);
            System.out.println("Writing: "+message.toString());
            objectOutputStream.writeObject(message);
            System.out.println("Message Written");
            socket.close();

        } catch( IOException ex) {
            ex.printStackTrace();

        } catch (ClassNotFoundException ex) {
            ex.printStackTrace();
        }
    }

    private void multiplyNumbers(Message message) {
        message.setResult(message.getFirstNumber().intValue() * message.getSecondNumber().intValue());
    }
}

訊息類別

 package com.company;

import java.io.Serializable;

public class Message implements Serializable {
    private static final long serialVersionUID = -72233630512719664L;

    Integer firstNumber = null;
    Integer secondNumber = null;
    Integer result = null;

    public Message(Integer firstNumber, Integer secondNumber) {
        this.firstNumber = firstNumber;
        this.secondNumber = secondNumber;
    }

    public Integer getFirstNumber() {
        return this.firstNumber;
    }

    public Integer getSecondNumber() {
        return this.secondNumber;
    }

    public Integer getResult() {
        return this.result;
    }

    public void setResult(Integer result) {
        this.result = result;
    }

    @Override
    public String toString() {
        return "Message{" +
                "firstNumber=" + firstNumber +
                ", secondNumber=" + secondNumber +
                ", result=" + result +
                '}';
    }
}
 objectOutputStream.writeChars("\n");

為什么要向ObjectOutputStream編寫換行符? 你永遠不會讀它。 不要那樣做 刪除此遇到的任何地方。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM