0

互いに連携して動作する2つのアプリがあります。1つは、GUIインターフェイスを持たず、データベースへのクエリを処理し、クライアントからの要求を処理する「サーバー」タイプのアプリです。もう1つは、主にGUIであり、ユーザーが構造化された方法でデータベース情報を操作するための「クライアント」です。

問題/トラブル/必要なヘルプ

私が抱えている問題は、1つのオブジェクト(String [])をサーバーに問題なく正常に送信できることです。クライアントアプリはそれを送信し、サーバーアプリはそれを受信して​​正常に処理します。

2番目のString[]を送信しようとすると、クライアントは配列をコンパイルして送信されたと見なしますが、サーバーはisを受信せず(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());

クライアントコード

これらのオブジェクトをサーバーアプリに送信するために使用されるクライアントコードは次のとおりです。

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

コメント

私には意味がありませんが、これとまったく同じコード形式を使用して、「null」を送信せずに、objectOutputStreamを介してサーバーからCLIENTアプリに多数のString[]を正常に送信します。

私はグーグルがこれを検索しましたが、まったく役に立ちませんでした。

できれば誰か助けてください!!

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

1 に答える 1

1

同じソケット入力/出力ストリーム上に複数の入力/出力ストリームを作成することはできません。それは機能しません。1種類のストリームを選択し、それを維持する必要があります。構造化データを送信する必要があるため、オブジェクトストリームのみを使用し、印刷ストリームを破棄する必要があります。クライアントからサーバーにさまざまなタイプのメッセージを送信する必要がある場合は、さまざまなタイプのメッセージを含めることができるラッピングSerializableオブジェクトタイプ(メッセージなど)の使用を検討する必要があります。

于 2013-02-19T17:00:24.060 に答える