java - Java猜数字游戏(客户端和服务器)。输入非整数时,会发生SocketException错误

标签 java sockets 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更改为

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

关于java - Java猜数字游戏(客户端和服务器)。输入非整数时,会发生SocketException错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64824004/

相关文章:

Flutter-平台: 10. 0.2.2禁止不安全的套接字连接

c# - 连接尝试失败,因为连接方在一段时间后没有正确响应。从 C# 调用存储过程时

java - Android : Socket - java.net.SocketException: sendto 失败: EPIPE (Broken pipe)

java - 池已满时的 ThreadPoolTask​​Scheduler 行为

java - 如果我在其中使用连接池,是否需要关闭 HttpClient (java)

sockets - 生成百万tcp连接的最佳方式

java - 使用 java 通过套接字连接传递 Ctrl+]

Java JTextPane HTML 编辑器 UTF-8 字符编码

java - 三星 Galaxy S4 的 Avd 无法正常工作

javascript - Socket.io 未在握手中发送 cookie,导致请求停止