Java数字猜谜游戏(客户端和服务器)。输入非整数时出现SocketException错误
当我输入一个非整数并将其发送到服务器时,我希望显示一条错误消息,并且套接字的连接被关闭 但事实并非如此。输入非整数后,程序不会打印出我创建的错误消息 在我终止服务器和客户端程序后,它告诉我发生了“套接字异常:连接重置”错误 我想知道为什么会这样 服务器Java数字猜谜游戏(客户端和服务器)。输入非整数时出现SocketException错误,java,sockets,socketexception,Java,Sockets,Socketexception,当我输入一个非整数并将其发送到服务器时,我希望显示一条错误消息,并且套接字的连接被关闭 但事实并非如此。输入非整数后,程序不会打印出我创建的错误消息 在我终止服务器和客户端程序后,它告诉我发生了“套接字异常:连接重置”错误 我想知道为什么会这样 服务器 import java.io.*; import java.net.*; import java.util.concurrent.*; public class NumberGuessingServer { static void clien
import java.io.*;
import java.net.*;
import java.util.concurrent.*;
public class NumberGuessingServer {
static void clientHandler(Socket socket) throws IOException {
Socket theSocket = socket;
// In
InputStream in = theSocket.getInputStream();
BufferedReader bin = new BufferedReader(new InputStreamReader(in));
//Out
PrintWriter pout = new PrintWriter(theSocket.getOutputStream(),true);
int guessCounter = 0;
int guessNumber = 0;
int randomNumber = (int) (Math.random() *100);
System.out.println("randomNumber: " + randomNumber);
boolean correct = true;
while(correct) {
**try {
guessNumber = Integer.parseInt(bin.readLine() );
} catch (NumberFormatException e) {
pout.println("Error message: " + bin.readLine() + " is not a valid integer number. The socket is closed now.");
correct = false;
} catch (Exception e) {
correct = false;
e.printStackTrace();
}**
//Compares each guess to the number
if (guessNumber == randomNumber) {
guessCounter++;
pout.println("Bingo! The number is " + randomNumber +
". You made it in " + guessCounter + " attempts.");
break;
}
else if (guessNumber > randomNumber) {
guessCounter++;
pout.println("Your guess is too high.");
}
else if (guessNumber < randomNumber) {
guessCounter++;
pout.println("Your guess is too low.");
}
} // end while loop
theSocket.close();
//Close all connection
socket.close();
}
public static void main(String args[]) {
int port;
if(args.length!=1)
port = 2000;
else
port = Integer.parseInt(args[0]);
ExecutorService executor = Executors.newCachedThreadPool();
try(ServerSocket ss = new ServerSocket(port)) {
System.out.println("Started listening to " + port);
while(true) {
System.out.println("Waiting for client...");
Socket s = ss.accept();
System.out.println("Starting a thread which will service the client");
executor.execute( () -> {
try {
clientHandler(s);
} catch (IOException e) {
e.printStackTrace();
}
} );
}
}
catch(IOException ioe) {
ioe.printStackTrace();
}
}
}
您的问题是您正在调用bin.readLine(),当发生异常时,您将再次调用它(它将尝试访问下一行…但没有下一行) 在
NumberGuessingServer.clientHandler
中,将while改为
while(correct) {
String messageFromClient = bin.readLine();
try {
guessNumber = Integer.parseInt(messageFromClient);
} catch (NumberFormatException e) {
pout.println("Error message: " + messageFromClient+ " is not a valid integer number. The socket is closed now.");
correct = false;
} catch (Exception e) {
correct = false;
e.printStackTrace();
}
//Compares each guess to the number
if (guessNumber == randomNumber) {
...
您的问题是您正在调用bin.readLine(),当发生异常时,您将再次调用它(它将尝试访问下一行…但没有下一行) 在
NumberGuessingServer.clientHandler
中,将while改为
while(correct) {
String messageFromClient = bin.readLine();
try {
guessNumber = Integer.parseInt(messageFromClient);
} catch (NumberFormatException e) {
pout.println("Error message: " + messageFromClient+ " is not a valid integer number. The socket is closed now.");
correct = false;
} catch (Exception e) {
correct = false;
e.printStackTrace();
}
//Compares each guess to the number
if (guessNumber == randomNumber) {
...