首页 > 解决方案 > 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();
        
    }        
}

标签: javasocketssocketexception

解决方案


您的问题是您正在调用 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) {
    ...

推荐阅读