为什么我的 else if code not 运行 在服务器端?我想在给定循环次数的情况下打印输入 运行 在客户端

Why is my else if code not running on a Server side? I want to get the input printed given number of times loop is running on client side

MyServer.java

import java.io.*;  
import java.net.*;  

public class MyServer {  
    public static void main(String[] args){  
        try{  
            ServerSocket ss=new ServerSocket(5001);  
            Socket s=ss.accept();//establishes connection   
            DataInputStream dis=new DataInputStream(s.getInputStream());  
            String  str=(String)dis.readUTF();  
            System.out.println("message= "+str);  

            DataOutputStream dout=new DataOutputStream(s.getOutputStream());  
            if ("Hi".equals(str)){
                dout.writeUTF("How are you?");
            } else if ("Bye".equals(str)){
                dout.writeUTF("Thankyou! Have a Good day!"); 
            } **else if (str != null)){
                try {
                    String numbers;
                    numbers = str.replaceAll("[^0-9]", ""); 
                    int number = Integer.parseInt(numbers);
                     dout.writeUTF("The line is being printed"); 
                    for (int i = 0; i < number; i++) {
                            dout.writeUTF(str.replaceAll("[^a-z,^A-Z]", ""));
                    }
                } catch (Exception e) {
                    //TODO: handle exception
                }**
                
                 
            } else {
                dout.writeUTF("Sorry!");
            }       
            dout.flush();  
            dout.close();  
            s.close();  
            ss.close();  
        } catch(Exception e) {
            System.out.println(e);
        } 
    }  
}  

MyClient.java

import java.io.*;  
import java.net.*;  
import java.util.*;  

public class MyClient {  
    public static void main(String[] args) {  
        try{
            Scanner sc = new Scanner(System.in);  
            Socket s=new Socket("localhost",5001);  
            DataOutputStream dout=new DataOutputStream(s.getOutputStream());
            String str1= sc.nextLine();           
            dout.writeUTF(str1);  
            dout.flush(); 
            
            DataInputStream dis=new DataInputStream(s.getInputStream());  
            String  str=(String)dis.readUTF(); 
            System.out.println("message= "+str);

            dout.close();  
            dis.close();
            s.close();  
        } catch(Exception e) {
            System.out.println(e);} 
    }  
} 

我正在从客户端向服务器提供输入,并希望在客户端多次打印该输入。但不能那样做。谁能让我知道我在这里犯了什么错误?它正在回复消息“嗨”和“再见”,其他一切正常。

以下是经过我更正后的代码。
(代码后的注释。)

Class MyServer

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class MyServer {
    public static void main(String[] args) {
        try (ServerSocket ss = new ServerSocket(5001)) {
            Socket s = ss.accept();// establishes connection
            InputStream is = s.getInputStream();
            DataInputStream dis = new DataInputStream(is);
            String str = dis.readUTF();
            System.out.println("message= " + str);
            DataOutputStream dout = new DataOutputStream(s.getOutputStream());
            if ("Hi".equals(str.trim())) {
                dout.writeUTF("How are you?");
            }
            else if ("Bye".equals(str)) {
                dout.writeUTF("Thankyou! Have a Good day!");
            }
            else if (str != null) {
                try {
                    String numbers;
                    numbers = str.replaceAll("[^0-9]", "");
                    int number = Integer.parseInt(numbers);
                    dout.writeUTF("The line is being printed");
                    for (int i = 0; i < number; i++) {
                        dout.writeUTF(str.replaceAll("[^a-z,^A-Z]", ""));
                    }
                }
                catch (Exception e) {
                    e.printStackTrace();
                }
            }
            dout.writeUTF("END");
            dout.flush();
        }
        catch (Exception e) {
            e.printStackTrace();
        }
        try {
            Thread.sleep(2000L);
        }
        catch (InterruptedException xInterrupted) {
            // Ignore.
        }
    }
}

Class MyClient

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.net.Socket;
import java.util.Scanner;

public class MyClient {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str1 = sc.nextLine();
        try (Socket s = new Socket("localhost", 5001)) {
            DataOutputStream dout = new DataOutputStream(s.getOutputStream());
            dout.writeUTF(str1);
            dout.flush();
            InputStream is = s.getInputStream();
            DataInputStream dis = new DataInputStream(is);
            String str = dis.readUTF();
            while (!"END".equals(str)) {
                System.out.println("message= " + str);
                str = dis.readUTF();
            }
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }
}

通过套接字发送和接收数据不是即时的。方法 readUTF 将等待直到有数据可读。它将读取上次调用方法 writeUTF 时发送的所有数据。方法 readUTF 将无限期等待。因此,服务器需要向客户端发送通知,告知没有更多数据要发送。在上面的代码中,我发送了字符串 END 以指示服务器正在发送的数据结束。另请注意,您只需要关闭您明确创建的资源。在 class MyServer 中,这仅表示 ServerSocket。我使用 try-with-resources 来确保 ServerSocket 关闭。

类似地,在 class MyClient 中,唯一需要明确关闭的资源是 Socket – 我再次使用 try-with-资源.

如果服务器终止,则关闭套接字。因此,在 class MyServer 中,在向客户端发送数据后,服务器等待两秒钟,希望这段时间足以让客户端读取该数据。