次のコードがあります。これは、ウィンドウが開いた場合にダイアログを表示し、サーバーに接続してデータを受信する必要があることを示しています。
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
。これは、クライアントが実際にサーバーに接続されていることを意味しますが、何らかの理由でサーバーからデータを読み取っていません!