У меня есть игра как блэкджек, у меня есть сервер и игроки. Когда я запускаю сервер и игроков на одном компьютере, он отлично работает. Но когда я запускаю игроков на одном ПК и сервере на другом ПК, он работает так редко. После некоторых писем с сервера и некоторых readLines от пользователей он дает мне «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;
}
Вначале нам понадобится stacktrace и фрагмент кода, в котором эта проблема происходит! –
По API исключение '' Брошено, чтобы указать, что есть ошибка при создании или доступе к Socket. "' - у вас есть ошибка в коде, который вы еще не показали нам. –
Код работает, когда я запускаю сервер и клиентов на одном компьютере. Это не когда сервер и клиенты в разных ПК. Код тот же, почему в одном случае он работает, а в другом случае он работает только наполовину. – user2911701