0

次のコードがあります。これは、ウィンドウが開いた場合にダイアログを表示し、サーバーに接続してデータを受信する必要があることを示しています。

private void formWindowOpened(java.awt.event.WindowEvent evt) {                                  
    this.jDialog1.setVisible(true);
    con = new Conexion();
    SwingWorker work = new SwingWorker() {
        @Override
        public Object doInBackground() {
            con.recibirDatos();
            return null;
        }

        @Override
        public void done() {
            jDialog1.dispose();
            jDialog2.setVisible(true);
        }
    };
    work.execute();
}

ここでConexion、クライアントごとに次のことを行います。

public Conexion() {
    try
    {
        this.puerto = 7896;
        this.s = new Socket("localhost", puerto);
        this.entrada = new DataInputStream(s.getInputStream());
        this.salida = new DataOutputStream(s.getOutputStream());
    }
    catch(UnknownHostException e){ System.out.println("Socket: "+e.getMessage()); }
    catch(EOFException e){ System.out.println("EOF: "+e.getMessage()); }
    catch(IOException e){ System.out.println("IO: "+e.getMessage()); }
}

public void recibirDatos() {
    try
    {
        this.salida.writeUTF("sendData");
        System.out.println("Leyendo...");
        this.color = this.entrada.readUTF();
        this.ancho = this.entrada.readInt();
        System.out.println("Datos recibidos: "+color+" "+ancho);
    }
    catch(UnknownHostException e){ System.out.println("Socket: "+e.getMessage()); }
    catch(EOFException e){ System.out.println("EOF: "+e.getMessage()); }
    catch(IOException e){ System.out.println("IO: "+e.getMessage()); }
}

サーバーに関しては、接続が読み取られると次のようになります。

public void enviarDatos(String color, int anchoLinea) {
    try
    {
        System.out.println(entradaCliente.readUTF()+"! Enviando datos: "+color+" "+anchoLinea);
        salidaCliente.flush();
        salidaCliente.writeUTF(color);
        salidaCliente.writeInt(anchoLinea);
        System.out.println("Datos enviados.");
    }
    catch(EOFException e){ System.out.println("EOF: "+e.getMessage()); }
    catch(IOException e){ System.out.println("IO: "+e.getMessage()); }
}

問題:

  • readUTF()これを実行すると、サーバーがすでにデータを送信しているにもかかわらず、クライアントがスタックします。
  • 整数のみを送受信する場合、送信する数値-1393754107ではなく値を取得しますが、クライアントがスタックすることはありません。
  • クライアントからサーバーにデータを送信すると、問題なく機能します。

何が問題なのですか?よろしくお願いします。

編集:私はまた、クライアントがのために待機している間にサーバーがシャットダウンした場合、クライアントはをreadUTF()取得しますIOException。これは、クライアントが実際にサーバーに接続されていることを意味しますが、何らかの理由でサーバーからデータを読み取っていません!

4

1 に答える 1

0

この作業を行うために、私が行ったのは、通常のDataInputStreamandDataOutputStreamObjectInputStreamandに置き換えることだけでしたObjectOutputStream。そして問題は解決しました、それはうまくいきました。

于 2012-12-15T02:38:51.803 に答える