0

サーバー側からクライアント側にオブジェクトを送信しようとしていますが、問題が見つかりません。クライアント側で発生するエラーは次のとおりです。

java.io.StreamCorruptedException: invalid type code: 43
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.readObject(Unknown Source)
at connection.MainClient.doAll(MainClient.java:56)
at connection.TestScreen$2.actionPerformed(TestScreen.java:82)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$200(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

以下はサーバー側の方法です。 無限ループの個別の方法は、ファイルから読み取り、サーバー クラスのインスタンス変数である ArrayList にユーザー名とパスワードを解析するだけです。

    public void doStuff() throws Exception
{
    ServerSocket serverSocket = new ServerSocket(5001);
    Socket clientSocket = serverSocket.accept();
    PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
    BufferedReader in = new BufferedReader(
            new InputStreamReader(
            clientSocket.getInputStream()));
    ObjectOutputStream objectOutput = new ObjectOutputStream(clientSocket.getOutputStream());
    String inputLine;
    out.println("Connected");
    while(true)
    {
        seperate();
        while ((inputLine = in.readLine()) != null) 
        {
            if(inputLine.equalsIgnoreCase("users"))
                objectOutput.writeObject(getUserNames());
            else
                if(inputLine.equalsIgnoreCase("pass"))
                    objectOutput.writeObject(getPassWords());
                else
                    if(inputLine.equalsIgnoreCase("stop"))
                        objectOutput.reset();
        }
    }
}

以下は、サーバーからの情報を要求するクライアント側です。

public boolean doAll(String name, String pass) throws Exception
{
    try 
    {
        kkSocket = new Socket("PC", 5001);
        out = new PrintWriter(kkSocket.getOutputStream(), true);
        in = new BufferedReader(new InputStreamReader(kkSocket.getInputStream()));
    } 
    catch (UnknownHostException e) 
    {
        System.err.println("Don't know about host: PC.");
        System.exit(1);
    }
    catch (IOException e) 
    {
        System.err.println("Couldn't get I/O for the connection to: PC.");
        System.exit(1);
    }

    ObjectInputStream objectInput = new ObjectInputStream(kkSocket.getInputStream());

    out.println("user");
    Object obj = objectInput.readObject();
    users = (ArrayList<String>)obj;
    out.println("pass");
    obj = objectInput.readObject();
    this.pass = (ArrayList<String>)obj;
    out.println("stop");
    objectInput.close();
    out.close();
    in.close();
    kkSocket.close();

    if(userIsRegistered(name,pass))
        return true;
    return false;
}

サーバーソケットとソケットの学習は初めてですが、ここで達成しようとしているのはこれです。別のクラスのボタンを押すと、次のようになります。

MainClient b = new MainClient();
login = b.doAll(userField.getText(),passField.getText());
Login is obviously a boolean.

ログインボタンが押されると、クライアントを呼び出してこのサーバーに接続し、指定されたディレクトリのテキストファイルに保存されているサーバー上のユーザーとパスのリストを取得します。次に、クライアントがこの情報を受け取ると、2 つのテキスト フィールドから取得した文字列からユーザーである可能性があるかどうかを確認し、true または false を返します。次に、サーバーへのソケットを閉じると、毎回再接続し続けるはずですよね?

私の主な問題は、スローし続けるエラーをどのように修正するかです。

4

2 に答える 2

1

InputStreamReaderバイト入力ストリームでは使用できません。入力ストリームからの文字/文字列を想定しています。代わりにObjectInputStreamを試してください。

ヒント:入力ストリームタイプは、サーバー側とクライアント側の両方で一致する必要があります。それらを混ぜることはできません。使用しているサーバーではObjectOutputStream、対応するObjectInputStreamものをクライアントで使用する必要があります。

于 2013-03-13T17:55:07.453 に答える
1

コードの流れは次のとおりです。

  1. サーバーが起動し、クライアントとの接続を待機しています
  2. サーバーは、 を使用してクライアントからの接続を受け入れますserverSocket.accept()
  3. サーバーは、を介してオブジェクトをString使用してクライアントにメッセージ (「接続済み」) を送信します。PrintWriterout.println("Connected")
  4. クライアントはObjectInputStream、ストリームの不一致につながるオブジェクトを使用してそのメッセージを読み取っているため、内部整合性チェックに違反しています。そのためStreamCorruptedException、クライアント側でスローさObjectInputStreamれます。サーバーから送信されたプレーンメッセージを読み取るために使用する代わりに、BufferedReader上記で作成したオブジェクトを使用する必要があります.

したがって、クライアント側では、コードを次のように変更する必要があります。

ObjectInputStream objectInput = new ObjectInputStream(kkSocket.getInputStream());
String message = in.readLine();//use BufferedReader to read the plain message coming from Server.
System.out.println("Message from server: "+message);
out.println("user");
Object obj = objectInput.readObject();
于 2013-03-14T17:25:35.510 に答える