套接字Writeint错误java

时间:2016-10-24 16:45:17

标签: java sockets

我有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;
}

1 个答案:

答案 0 :(得分:0)

此错误通常表示在您编写时另一端已断开连接。这很可能是因为您写的是DataOutputStream,但读作ObjectInputStream且不兼容。

BTW当你包裹一个流时,我建议你只包装一次,否则会导致混乱。