Java SwingWorker和TCP连接无法正常工作

时间:2012-12-14 19:33:42

标签: java swing tcp

我有以下代码,它描述了如果一个窗口打开,它应该呈现一个对话框可见,连接到服务器,并接收数据:

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,这意味着客户端实际上已连接到服务器,但由于某种原因,它不是从中读取数据!

1 个答案:

答案 0 :(得分:0)

为了完成这项工作,我所做的就是用DataInputStreamDataOutputStream取代通常的ObjectInputStreamObjectOutputStream。问题解决了,它奏效了。