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