我有以下代码,它描述了如果一个窗口打开,它应该呈现一个对话框可见,连接到服务器,并接收数据:
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
,这意味着客户端实际上已连接到服务器,但由于某种原因,它不是从中读取数据!
答案 0 :(得分:0)
为了完成这项工作,我所做的就是用DataInputStream
和DataOutputStream
取代通常的ObjectInputStream
和ObjectOutputStream
。问题解决了,它奏效了。