2017-04-13 4 views
0

Kann jemand bitte dieses Problem beheben. Mit JDK 1.8 versuche ich eine sehr einfache Chat-Anwendung in Java mit Sockets zu erstellen. In meiner Clientklasse, sobald die folgende Zeile ausgeführt wird Nachricht returnMessage = (Message) objectInputStream.readObject(); es löst Ausnahme aus. Exception in thread „main“ java.io.OptionalDataExceptionobjectInputStream.readObject() löst Ausnahme aus java.io.OptionalDataException

ich nur Objekte vom Typ Nachricht an den Strom schreibe und Objekte vom Typ der Nachricht zu lesen, da ich einmal geschrieben, ich glaube nicht, dass ich etwas tue, falsch in sie nacheinander lesen.

F: Auch lassen Sie mich bitte wissen, was ist der beste Weg, um diese Art von Anwendung zu debuggen, wie den Haltepunkt im Server zu schlagen, während Client läuft?

Kunde

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; 
    } 
} 

Server

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(); 
     } 
    } 
} 

Sever Thema

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()); 
    } 
} 

Nachrichtenklasse

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 + 
       '}'; 
    } 
} 
+0

Bitte helfen Sie sich [ergänzende Debugging-Techniken] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/). Wenn Sie danach immer noch Probleme haben, können Sie gerne mit einem [minimalen, vollständigen und überprüfbaren Beispiel] (http://stackoverflow.com/help/mcve) zurückkommen, das Ihr Problem demonstriert. –

+0

Ich weiß, wie Debuggen in Java, ich kann Debug-Client, aber mein Haltepunkt in Server schlägt nicht, ich denke, es gibt eine andere Technik, diese Art von Client-Server-Anwendungen zu debuggen. – ATHER

+0

In diesem Fall besteht mein Vorschlag darin, zu überprüfen, ob Sie im Debug-Modus ausgeführt werden, und dann Ihren Haltepunkt an einen anderen Ort zu verschieben, an dem er wahrscheinlich getroffen wird. –

Antwort

2
objectOutputStream.writeChars("\n"); 

Warum schreiben Sie eine neue Zeile in eine ObjectOutputStream? Du liest es nie. Tu das nicht. Entfernen Sie dies, wo immer es auftritt.

+0

Ich musste das tun, weil mein Eingangsstrom auf der Client-Seite blockiert wurde. Ich werde versuchen, es zu entfernen und werde Sie trotzdem aktualisieren. Mal sehen, ob das funktioniert. – ATHER

+0

Nein, Sie mussten dies nicht tun, weil der Eingabestream auf der Clientseite blockiert wurde. Die 'flush()' war alles was du brauchst. – EJP

+0

Yup, das hat funktioniert. +1 für dich. – ATHER

Verwandte Themen