Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java数字猜谜游戏(客户端和服务器)。输入非整数时出现SocketException错误_Java_Sockets_Socketexception - Fatal编程技术网

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) {
    ...