Java 套接字中的连接重置

Java 套接字中的连接重置,java,sockets,socketexception,Java,Sockets,Socketexception,我有一个像21点这样的游戏,我有一个服务器和玩家。当我在同一台计算机上执行服务器和播放器时,它工作得非常好。但是,当我在一台电脑上执行播放器,在另一台电脑上执行服务器时,这种情况非常罕见。在从服务器发送一些写字节和从用户发送一些读行之后,它会给我“Java.net.SocketException:Connection reset” 为什么会这样 Socket registre = null; try{ regist

我有一个像21点这样的游戏,我有一个服务器和玩家。当我在同一台计算机上执行服务器和播放器时,它工作得非常好。但是,当我在一台电脑上执行播放器,在另一台电脑上执行服务器时,这种情况非常罕见。在从服务器发送一些写字节和从用户发送一些读行之后,它会给我“Java.net.SocketException:Connection reset”

为什么会这样

            Socket registre = null;

            try{
                registre = new Socket(IP,port);
            }
            catch(java.net.ConnectException e){
                System.out.println("Servidor de partida incorrecte.");
                break;
            }
            catch(java.net.UnknownHostException e){
                System.out.println("Servidor de partida incorrecte.");
                break;
            }
            catch(java.net.SocketException e){
                System.out.println("Servidor de partida incorrecte.");
                break;
            }

            DataOutputStream sendToServer = new DataOutputStream(registre.getOutputStream());
            BufferedReader receiveFromServer = new BufferedReader(new InputStreamReader(registre.getInputStream())); 

            numCartes = 2;

            sendToServer.writeBytes("JUG"+"/"+portJug+ '\n');

            boolean llistaJugadors = false;

            servidorJoc = receiveFromServer.readLine().trim();
            System.out.println(servidorJoc);
            System.out.println("----------------------------------");

            while(!llistaJugadors){

                servidorJoc = receiveFromServer.readLine().trim();

                if (servidorJoc.equalsIgnoreCase("exit")){
                    llistaJugadors=true;
                }
                else{
                    System.out.println(servidorJoc);
                }
            }
            System.out.println("----------------------------------");

            boolean jocAcabat= false;               
            jugant = true;
            boolean canviant = false;
            String torn=null;
            boolean unCanviEfectuat=false;

            torn = receiveFromServer.readLine().trim(); 
            System.out.println(torn);

            String[] jug = torn.split("-");
            jugador = jug[1];
            jug = torn.split(":");
            float puntuacio = Float.parseFloat(jug[1]);

            if (puntuacio>=7.5){
                jugant=false;
            }

            while (!jocAcabat){

                if (canviant==false && jugant){
                    torn = receiveFromServer.readLine().trim();
                    System.out.println(torn);

                    if (llegirMes==1){
                        String[] infor = torn.split(":");

                        float passat = Float.parseFloat(infor[1]);

                        if (passat>=7.5){
                            jugant=false;
                            System.out.println("T'has passat amb puntuacio: "+passat);
                        }
                    }
                }

                if (llegirMes==1){
                    torn = receiveFromServer.readLine().trim();
                    System.out.println(torn);
                    llegirMes=0;
                    canviant=false;
                }


                String[] data = torn.split(":");

                if(data[0].trim().equalsIgnoreCase("torn") && jugant){

                    ImprimirMenu2();

                    fet=false;
                    int conf=0;

                    while (!fet){
                        try{
                            conf = Integer.parseInt(teclat.readLine());
                            if(conf<4 && conf>0){
                                fet=true;
                            }

                        }
                        catch(NumberFormatException e){
                            System.out.println("Intrudueix un enter entre 1-3");
                        }

                    }

                    switch (conf){

                    case 1:
                        canviant = false;
                        sendToServer.writeBytes("CARTA+" + "\n");
                        receiveFromServer = new BufferedReader(new InputStreamReader(registre.getInputStream())); 
                       torn = receiveFromServer.readLine().trim();  <----CRASH
                        System.out.println(torn);
                        String[] puntuacion = torn.split(":");
                        float punt = Float.parseFloat(puntuacion[1]);
                        if (punt>=7.5){
                            jugant=false;
                        }
                        unCanviEfectuat=false;
                        numCartes++;
                        break;
                    case 2:
                        canviant = false;
                        sendToServer.writeBytes("TREE" + "\n");
                        receiveFromServer = new BufferedReader(new InputStreamReader(registre.getInputStream()));  
                        torn = receiveFromServer.readLine().trim();     <----CRASH
                        System.out.println(torn);
                        jugant = false;
                        unCanviEfectuat=false;
                        break;

                    case 3:

                        if (unCanviEfectuat){
                            System.out.println("Ja has fet un canvi aquest torn, no pots fins el seguent.");
                            break;
                        }
                        else{
                            canviant = true;
                            System.out.println("Introdueix la ip del jugador: ");
                            llegit = false;
                            String ip = teclat.readLine();
                            int portJugador = 0;
                            System.out.println("Introdueix el port: ");

                            while(!llegit){

                                try{
                                    portJugador = Integer.parseInt(teclat.readLine());
                                    llegit=true;
                                }
                                catch(NumberFormatException e){
                                    System.out.println("Has introduit un valor incorrecte.");
                                }
                            }

                            Socket conectarjugador = null;

                            try{
                                conectarjugador = new Socket(ip,portJugador);
                            }

                            catch(java.net.ConnectException e){
                                System.out.println("Jugador incorrecte");
                                break;
                            }

                            catch(java.net.UnknownHostException e){
                                System.out.println("Jugador incorrecte");
                                break;
                            }

                            catch(java.net.SocketException e){
                                System.out.println("Servidor de partida incorrecte.");
                                break;
                            }

                            BufferedReader receiveFromJugador = new BufferedReader(new InputStreamReader(conectarjugador.getInputStream())); 

                            String info = receiveFromJugador.readLine().trim();

                            if (info.equalsIgnoreCase("estic plantat!")){
                                System.out.println("El jugador es troba plantat. No pot canviar Cartes.");
                                break;
                            }
                            else{

                                if (info.equalsIgnoreCase("deny.")){
                                    System.out.println("El jugador no vol fer el canvi.");
                                    break;
                                }

                                else {
                                    System.out.println("El jugador ha acceptat el canvi, procedim a efectuar els canvis.");

                                    info = receiveFromJugador.readLine().trim();

                                    String[] informacio = info.split(":");
                                    int cartaCanviarJug2 = Integer.parseInt(informacio[0]);
                                    String jugadorCanvi = informacio[1];

                                    unCanviEfectuat=true;

                                    min =0;
                                    max = numCartes-1;
                                    rand = new Random();
                                    int cartaCanviar = rand.nextInt((max-min)+1)+min;

                                    sendToServer.writeBytes("CHANGE:"+jugador+":"+cartaCanviar+":"+jugadorCanvi+":"+cartaCanviarJug2+ "\n");

                                    info = receiveFromServer.readLine().trim();

                                    informacio = info.split(":");
                                    float passat = Float.parseFloat(informacio[1]);

                                    if (passat>=7.5){
                                        jugant=false;
                                        System.out.println(info);
                                        System.out.println("T'has passat amb puntuacio: "+passat);
                                    }
                                    else{
                                        System.out.println(info);
                                    }

                                }
                            }
                        }
                        break;
                    }
                }

                else {

                    jugant=false;
                    boolean noAcabat=true;
                    while (noAcabat){

                        try{
                            torn = receiveFromServer.readLine().trim();     
                        }
                        catch(java.net.SocketException e) {
                            return;
                        }
                        System.out.println(torn);
                        data = torn.split(":");

                        if (data[0].equalsIgnoreCase("Resultat")){
                            torn = receiveFromServer.readLine().trim();     
                            if (torn.equalsIgnoreCase("has guanyat")){
                                System.out.println("      @@ "+ torn + " @@");
                            }
                            else{
                                System.err.println("      @@ "+ torn + " @@");
                            }

                            return;

                        }
                    }
                }
            }

            break;
        case 3:
            System.out.println("Has desconectat.");
            return;

        default:
            break;
        }

    }

    return;
}
socketregistre=null;
试一试{
registre=新套接字(IP,端口);
}
catch(java.net.connecte){
System.out.println(“服务方不正确”);
打破
}
catch(java.net.UnknownHostException e){
System.out.println(“服务方不正确”);
打破
}
catch(java.net.SocketException e){
System.out.println(“服务方不正确”);
打破
}
DataOutputStream sendToServer=新的DataOutputStream(registre.getOutputStream());
BufferedReader receiveFromServer=new BufferedReader(new InputStreamReader(registre.getInputStream());
numCartes=2;
sendToServer.writeBytes(“JUG”+“/”+portJug++'\n');
布尔值listajugadors=false;
SERVIEDORJOC=receiveFromServer.readLine().trim();
系统输出打印LN(servidorJoc);
System.out.println(“---------------------------------------------”);
而(!Listajugadors){
SERVIEDORJOC=receiveFromServer.readLine().trim();
if(servidorJoc.equalsIgnoreCase(“出口”)){
利斯塔贾加多斯=真;
}
否则{
系统输出打印LN(servidorJoc);
}
}
System.out.println(“---------------------------------------------”);
布尔值jocAcabat=false;
共轭=真;
布尔canviant=false;
字符串=空;
布尔unCanviEfectuat=false;
撕裂=receiveFromServer.readLine().trim();
系统输出打印LN(撕裂);
字符串[]jug=撕裂。拆分(“-”);
jugador=jug[1];
罐子=撕裂。裂开(“:”);
float puntuacio=float.parseFloat(jug[1]);
如果(puntuacio>=7.5){
共轭=假;
}
而(!乔卡巴特){
if(canviant==false&&jugant){
撕裂=receiveFromServer.readLine().trim();
系统输出打印LN(撕裂);
如果(llegirMes==1){
字符串[]infor=strive.split(“:”);
float passat=float.parseFloat(infor[1]);
如果(帕萨特>=7.5){
共轭=假;
System.out.println(“T'has passat amb puntuacio:”+passat);
}
}
}
如果(llegirMes==1){
撕裂=receiveFromServer.readLine().trim();
系统输出打印LN(撕裂);
llegirMes=0;
canviant=假;
}
字符串[]数据=撕裂。拆分(“:”);
if(数据[0].trim().equalsIgnoreCase(“撕裂”)&共轭){
ImprimirMenu2();
fet=假;
int conf=0;
而(!fet){
试一试{
conf=Integer.parseInt(teclat.readLine());
if(conf0){
fet=真;
}
}
捕获(数字格式){
System.out.println(“入侵者未进入1-3”);
}
}
开关(配置){
案例1:
canviant=假;
sendToServer.writeBytes(“CARTA+”+“\n”);
receiveFromServer=new BufferedReader(新的InputStreamReader(registre.getInputStream());
撕裂=receiveFromServer.readLine().trim();=7.5){
共轭=假;
}
unCanviEfectuat=false;
numCartes++;
打破
案例2:
canviant=假;
sendToServer.writeBytes(“树”+“\n”);
receiveFromServer=new BufferedReader(新的InputStreamReader(registre.getInputStream());
撕裂=receiveFromServer.readLine().trim();=7.5){
共轭=假;
系统输出打印项次(信息);
System.out.println(“T'has passat amb puntuacio:”+passat);
}
否则{
系统输出打印项次(信息);
}
}
}
}
打破
}
}
否则{
共轭=假;
布尔值noAcabat=true;
while(noAcabat){
试一试{
撕裂=receiveFromServer.readLine().trim();
}
catch(java.net.SocketException e){
返回;
}
系统输出打印LN(撕裂);
数据=撕裂。拆分(“:”);
if(数据[0].equalsIgnoreCase(“Resultat”)){
撕破