我有3个.java 1.服务员 2.克莱恩特 3. HiloSala
好吧,当我打开一个客户端,在.java servidor上,接受客户端的de conection并保存Socket和发送客户端的Arraylist,他们启动HiloSala方法,必须发送一个writeInt但我有这个问题:
java.net.SocketException: Software caused connection abort: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(Unknown Source)
at java.net.SocketOutputStream.write(Unknown Source)
at java.io.DataOutputStream.writeInt(Unknown Source)
at batalla.jframes.HiloSala.atacar(HiloSala.java:54)
at batalla.jframes.HiloSala.jugar(HiloSala.java:26)
at batalla.jframes.HiloSala.<init>(HiloSala.java:17)
at batalla.jframes.frmservidor.run(frmservidor.java:90)
at java.lang.Thread.run(Unknown Source).
.Java Servidor
public void run(){try{
sv = new ServerSocket(puerto);
int i=0;
while(true){
while(i<2){
sc = new Socket();
sc = sv.accept();
recibir=new ObjectInputStream(sc.getInputStream());
List<String>listaRecibir=(List<String>)recibir.readObject();
nuevoCliente=new Cliente(sc,listaRecibir);
lista.add(nuevoCliente);
/*for(int x=0; x<listaRecibir.size();x++){
System.out.println(listaRecibir.get(x));
}*/
//System.out.println("-------");
//sc.close();
i++;
}
//sala=new HiloSala(lista.get(lista.size()-1), lista.get(lista.size()));
sala=new HiloSala(lista.get(0), lista.get(1));
i=0;
}
}catch(Exception e){
System.out.println("no anda 1");
e.printStackTrace();
}
}
.java hiloSala
public HiloSala(Cliente c1, Cliente c2){
this.c1=c1;
this.c2=c2;
jugar();
}
public void jugar() {
boolean flag=true;
while(flag){
atacar(c1,c2);
System.out.println("salio");
atacar(c2,c1);
/*if(c1.getRecibido().size()==0 || c2.getRecibido().size()==0){
flag=false;
}*/
}
/*
atacar(c1,c2);
System.out.println("salio");
atacar(c2,c1);
atacar(c1,c2);
System.out.println("salio");
atacar(c2,c1);
*/
}
public void atacar(Cliente c1, Cliente c2){
int control=0;
try{
DataInputStream recibirPos;
DataOutputStream salidaj=new DataOutputStream(c1.getSc().getOutputStream());
salidaj.writeInt(1); //ERROR HERE
salidaj.flush();
salidaj.close();
///////////////////////////////////////////////////
DataOutputStream salidak=new DataOutputStream(c2.getSc().getOutputStream());
salidak.writeInt(2);
salidak.flush();
salidak.close();
///////////////////////////////////////////////////
int estadocasilla = 0; // 0=AGUA , 1=TOCADO/HUNDIDO
String bufferAtacado = "";
DataOutputStream salidac1=new DataOutputStream(c1.getSc().getOutputStream());
salidac1.writeInt(1);
String posicion="";
recibirPos=new DataInputStream(c1.getSc().getInputStream());
posicion=recibirPos.readUTF();
System.out.println("posicion: "+posicion);
//ENVIANDO AL ATACANTE PARA INFORMARLE SI LE PEGO O NO AL BARCO ENEMIGO
DataOutputStream salida=new DataOutputStream(c1.getSc().getOutputStream());
DataOutputStream salida2=new DataOutputStream(c2.getSc().getOutputStream());
System.out.println(c2.getRecibido().size());
for(int i=0; i<c2.getRecibido().size();i++){
System.out.println(c2.getRecibido().get(i));
if(posicion.equals(c2.getRecibido().get(i))){
System.out.println("qweqew");
estadocasilla = 1;
salida.writeInt(estadocasilla);
c2.getRecibido().remove(i);
}
}
if(estadocasilla==0)
salida.writeInt(0);
//ENVIANDO AL ATACADO PARA INFORMARLE SI LE PEGARON O NO A SU BARCO
bufferAtacado = ""+posicion+""+estadocasilla;
System.out.println(bufferAtacado);
salida2.writeUTF(bufferAtacado);
////////////////////////////////////////////////////////////
estadocasilla=0;
salida.flush();
salida2.flush();
salida.close();
salida2.close();
////////////////////////////////////////////
//sv.close();
}catch(Exception e){System.out.println("no anda 2");
e.printStackTrace();}
}
.java Cliente
public Cliente(Socket sc, List<String> recibido){
this.sc=sc;
this.recibido=recibido;
}
public Socket getSc() {
return sc;
}
public void setSc(Socket sc) {
this.sc = sc;
}
public List<String> getRecibido() {
return recibido;
}
public void setRecibido(List<String> recibido) {
this.recibido = recibido;
}
答案 0 :(得分:0)
此错误通常表示在您编写时另一端已断开连接。这很可能是因为您写的是DataOutputStream
,但读作ObjectInputStream
且不兼容。
BTW当你包裹一个流时,我建议你只包装一次,否则会导致混乱。