2013-02-19 2 views
0

나는 서로 연동하는 두 개의 응용 프로그램이 있습니다. 하나는 GUI 인터페이스가 없으며 데이터베이스에 대한 쿼리를 처리하고 클라이언트의 요청을 처리하는 "서버"유형의 앱입니다. 다른 하나는 주로 GUI이고 사용자가 구조화 된 방식으로 데이터베이스 정보와 상호 작용하는 "클라이언트"입니다.스트림 - ObjectOutputStream NULL을 제공

호/트러블/HELP는

내가 서버에 성공적으로하고 아무런 문제없이 하나의 객체 (문자열 [])로 보낼 수 있다는 데 문제를 필요로했다. 클라이언트 응용 프로그램이 그것을 전송, 서버 응용 프로그램이 그것을 처리 성공적으로 처리합니다.

두 번째 String []을 보내려고하면 클라이언트가 배열을 컴파일하고 보낸다 고 생각하지만 서버는 결코 수신하지 않고 (null 만 가져옴) IOException을 생성합니다.

동일한 위치와 동일한 텍스트를 정확히 동일한 형식 및 위치에 포함하는 배열의 경우에도 마찬가지입니다.

의 printStackTrace (의해 생성 된 에러)이다

Java.io.OptionalDataException 
at java.io.ObjectInputStream.readObject0 (ObjectInputStream.java:1367) 
at java.io.ObjectInputStream.readObject (ObjectInputStream.java:369) 
at server.ConnectionThread.processClientRequests(ConnectionThread:204) 
at server.ConnectionThread.processClientRequests(ConnectionThread:50) 
at javalang.Thread.run(Thread.java:722) 

ObjectStream의이으로부터 판독되고있는 점이다 라인 (204)에서 코드 :

String[] addArray = (String[]) ois.readObject(); 

OIS는 ObjectInputStream를이고이

private ObjectInputStream ois = new ObjectInputStream(socket.getInputStream()); 

CLIE NT 코드는 서버 응용 프로그램 이러한 개체를 전송하는 데 사용되는 클라이언트 코드

입니다이 동일한 코드 형식이라는 것이다

ObjectToServer.writeObject(String[] var); 
ObjectToServer.flush(); 
ObjectToServer.reset(); 

코멘트 나에게 이해가되지 않습니다 무엇

"null"을 보내지 않고도 SERVER의 objectOutputStream에 대한 String []을 성공적으로 클라이언트 응용 프로그램에 전송하는 데 사용됩니다.

Google에서이 모든 것을 검색했습니다. 절대 아무 소용이 없습니다.

가능한 경우 도움을 받으십시오.

       ADDITIONAL CODE 

// CONNECTION THREAD IS ON SERVER APP, SETS UP STREAMS AND WAITS FOR MESSAGES FROM CLIENT 
// HANDLES COMMUNICATION FROM CLIENT AND REST OF SERVER 

public class ConnectionThread implements Runnable 
{ 

    private Socket socket; 
    private SystemCore core; 
    //Streams for connections 
    private InputStream is; 
    private OutputStream os; 
    //Writers and readers for communication of Strings 
    private PrintWriter toClient; 
    private BufferedReader fromClient; 
    // Writers and readers for sending and receiving Objects between server and client. 
    private ObjectInputStream ois = null; 
    private ObjectOutputStream oos = null; 
    //Protocol 
    static final String CLIENT_QUITTING = "Exit"; 

    public ConnectionThread(Socket s, SystemCore aSysCore) 
    { 
     socket = s; 

     // State of the SystemCore as taken from HelloServer 
     core = aSysCore; 
    } 

    public void run() 
    { 
     try 
     { 
      openStreams(); 
      toClient.println(MESSAGE_TO_CLIENT); 
      processClientRequests(); 
      closeStreams(); 
      this.socket.close(); 
     } 
     catch (OptionalDataException ode) 
     { 
      System.out.println("OptionalDataException: "); 
      System.out.println("length is: " + ode.length); 
     } 
     catch (IOException ioe) 
     { 
      System.out.println("IO trouble with a connection in ConnectionThread run() " + ioe.getMessage()); 
      ioe.printStackTrace(); 
     } 
     catch (ClassNotFoundException cnf) 
     { 
      System.out.println("Class trouble with a connection in ConnectionThread run() " + cnf.getMessage()); 
      cnf.printStackTrace(); 
     } 
     catch(ParseException pe) 
     { 
      System.out.println("Parse trouble with a connection in ConnectionThread run() " + pe.getMessage()); 
      pe.printStackTrace(); 
     } 
    } 

    /** 
    * Opens streams between the server and the client. 
    * 
    * @throws IOException 
    */ 
    private void openStreams() throws IOException 
    { 
     final boolean AUTO_FLUSH = true; 
     this.is = this.socket.getInputStream(); 
     this.fromClient = new BufferedReader(new InputStreamReader(is)); 
     this.os = this.socket.getOutputStream(); 
     this.toClient = new PrintWriter(os, AUTO_FLUSH); 

     //Object streams. 
     oos = new ObjectOutputStream(socket.getOutputStream()); 
     ois = new ObjectInputStream(socket.getInputStream()); 

     System.out.println("...Streams set up"); 
    } 


    /** 
    * Private method that accepts arguments from a client and executes the related 
    * commands in the systemcore as long as the command passed from the client 
    * is not CLIENT_QUITTING. 
    * 
    * @throws IOException 
    * @throws ClassNotFoundException 
    */ 
    private void processClientRequests() throws IOException, ClassNotFoundException, ParseException 
    { 
     String commandFromClient; 
     commandFromClient = fromClient.readLine(); 
     while (!(commandFromClient.equals(CLIENT_QUITTING))) 
     { 
      if (commandFromClient.equals("addProjectPrepare")) 
      { 
       String[] addArray = (String[]) ois.readObject(); 
       core.addProjectPrepare(addArray); 
      } 
      if (commandFromClient.equals("editProjectPrepareDetails")) 
      { 
       String[] editArray = (String[]) ois.readObject(); 
       recruit.editProjectPrepareDetails(editArray);    
      } 
     } 
      commandFromClient = fromClient.readLine(); 
    } 


**// CLIENT SIDE (User GUI) CODE THAT SENDS STRING[] TO THE SERVER** 




public void saveAction() 
    { 
     // TEST TO SEE IF THE DATE ENTERED IS CORRECT FORMAT, IF NOT NO SAVE OCCURRS 

    boolean parsedOk = false; 

    if (this.arrivalDateTextField.getText().isEmpty() == false) 
    { 
     try 
     { 
      // Check if date is correct format. Nothing will be done with 
      // the testDate object 

      MyDate testDate = new MyDate(
        this.arrivalDateTextField.getText()); 

      //Allow write to server to occur. 
      parsedOk = true; 
      //If date is okay, send form data to server. 
     } 
     catch (ParseException pe) 
     { 
      this.arrivalDateTextField.setText(""); // Set text field to blank 
      int messageIcon = javax.swing.JOptionPane.ERROR_MESSAGE; 
      JOptionPane.showMessageDialog(this, "Invalid date", 
        "Warning", messageIcon); 
     } 
    } 
    else 
    { 
     parsedOk = true; // No date entered so allow blank. 
    } 
    if (parsedOk == true) 
    { 
     // WRITE DATA TO SERVER OCCURS HERE: 

     try 
     { 

      **//getPersonDetails() returns a String[]** 

      ManageClientConnections.toServer.println("addNewData");     
     ManageClientConnections.objectToServer.writeObject(this.getPersonDetails()); 
      ManageClientConnections.objectToServer.flush(); 
      ManageClientConnections.objectToServer.reset(); 
     } 
     catch (IOException ioe) 
     { 
      System.out.println(
        "While writing new person to server, there was an error: " + ioe.getMessage()); 
     } 

     // And dispose of the GUI, inside the parseok if clause 
     this.dispose(); 
    } 
} 
+0

일부 코드가 표시됩니다. – jtahlborn

+0

'OptionalDataException'을 잡아 내고'exception.length' 필드를 출력 할 수 있습니까? 또한 위의 의견. – ddmps

+0

왜 출력 스트림을 재설정합니까? – Fildor

답변

1

당신은 다수에게 동일한 소켓 입력/출력 스트림을 통해 입력/출력 스트림을 생성 할 수 없습니다. 그게 작동하지 않습니다. 한 가지 유형의 강을 골라서 붙잡아 야합니다. 구조화 된 데이터를 전송해야하므로 오브젝트 스트림 만 사용하고 인쇄 스트림을 버리면됩니다. 클라이언트에서 서버로 다른 유형의 메시지를 보내야하는 경우 다른 유형의 메시지를 포함 할 수있는 배치 가능한 Serializable 객체 유형 (예 : Message)을 사용하는 것을 고려해야합니다.

+0

하지만 여러 개의 * 스트림 *이 아닌 하나의 스트림에 여러 개의 개체가 쓰여져 플러시되고 다시 설정됩니다. 서버 응용 프로그램에서 클라이언트 응용 프로그램으로의 단일 스트림에 여러 객체를 작성하면 작동합니다. – JTB

+1

@joelBeaton - 응? 당신의'openStreams' 메소드는 _same_ 소켓 InputStream 위에 BufferedReader와 ObjectInputStream을 생성합니다. – jtahlborn

+0

True (하나는 BufferedReader)는 클라이언트 응용 프로그램에서 PrintWriter로 쓰여진 문자열을 처리하는 반면 다른 하나 (ObjectInputStream)는 클라이언트에서 들어오는 객체를 처리합니다. 그건 허용되지 않습니까? 두 개의 소켓 객체를 만들고이 트래픽을 분할해야합니까? – JTB