2016-10-24 33 views
0

我有3个的.java 1. Servidor 2. Cliente 3. HiloSala套接字Writeint错误的Java

好吧,当我打开一个客户端上的.java servidor,接受德客户端的连接如并保存插座和向客户端发送一个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

此错误通常意味着另一端,而你正在写断开。这很可能是因为你写作为DataOutputStream,但读数为ObjectInputStream,这是不兼容的。

顺便说一句当你打包一个流时,我建议你只打包一次,否则会导致混淆。

+0

我用DataOutputStream类用于读写.. – Vanshii

+0

我想它在这里等候消息: 公共无效的run(){ \t \t \t尝试{ \t \t而(真){ \t \t DataInputStream entrada = new DataInputStream(sc.getInputStream()); \t \t int flag = entrada.readInt(); \t \t if(flag == 1){ \t \t menuataque(); \t} \t if(flag == 2){ \t \t recibirAtaque(); \t \t} \t \t entrada.close(); \t} \t} catch(Exception e){ \t \t System.out.println(“Error conexion pidiendo tablero ataque”); \t \t e.printStackTrace(); \t} \t} \t }''' – Vanshii

+0

公共无效的run(){ \t \t \t尝试{ \t \t而(真){ \t \t DataInputStream所ENTRADA =新DataInputStream类(sc.getInputStream ()); \t \t int flag = entrada。的readInt(); \t \t if(flag == 1){ \t \t menuataque(); \t} \t if(flag == 2){ \t \t recibirAtaque(); \t \t} \t \t entrada.close(); \t} \t} catch(Exception e){ \t \t System.out.println(“Error conexion pidiendo tablero ataque”); \t \t e.printStackTrace(); \t} \t} \t }' – Vanshii