java - Java 猜数字游戏(客户端和服务器)。输入非整数时发生 SocketException 错误
问题描述
当我输入一个非整数并将其发送到服务器时,我预计会显示一条错误消息并且套接字的连接已关闭。
但它没有发生。输入非整数后,程序不会打印出我创建的错误消息。
在我终止服务器和客户端程序后,它告诉我“套接字异常:连接重置”错误发生了。
我想知道为什么会这样。
服务器
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();
}
}
}
客户
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
public class NumberGuessingClient {
public static void main(String[] args) throws UnknownHostException, IOException {
int port;
if(args.length!=1)
port = 2000;
else
port = Integer.parseInt(args[0]);
Scanner sc = new Scanner(System.in);
Socket socket = new Socket("127.0.0.1", port);
System.out.println("Connected to localhost...");
System.out.println("Guess a number between 0 and 99.");
boolean correct = true;
String userInput = "";
//Out
PrintWriter pout = new PrintWriter(socket.getOutputStream(),true);
//In
InputStream in = socket.getInputStream();
BufferedReader bin = new BufferedReader(new InputStreamReader(in));
while (correct) {
System.out.println("Enter number: ");
userInput = sc.nextLine();
//Send a variable value to server
pout.println(userInput);
// Get result from server
//After sending each guess,
//the client reads a reply message from the server and displays the message.
String result = bin.readLine();
System.out.println(result);
//Checks if the message contains the word “Bingo”;
//if so, the client closes the socket to the server and ends execution.
if (result.contains("Bingo")) {
correct = false;
}
else if (result.contains("Error")) {
correct = false;
}
else {
correct = true;
}
System.out.println("end");
}// end of while loop
//Close
sc.close();
socket.close();
}
}
解决方案
您的问题是您正在调用 bin.readLine() 并且当发生异常时,您再次调用它(它将尝试访问下一行......但没有下一行)
在NumberGuessingServer.clientHandler
更改您的同时正确为
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) {
...