簡體   English   中英

如何從服務器(主)class 啟動客戶端 class

[英]How do I launch the client class from the server(main) class

在我的作業中,我們應該修改代碼,以便 Main class 啟動一個服務器,然后啟動一個客戶端,我們在其中輸入一個數字並將其發送到服務器,然后確定它是否為素數並返回結果給客戶。 運行和交互都很好,但我必須單獨運行。 如何先運行 Main(server) 程序,然后讓它自動啟動客戶端?

package application;//Server code starts here
    
import java.io.*;
import java.net.*;
import java.util.Date;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.scene.Scene;
import javafx.scene.control.ScrollPane;
import javafx.scene.control.TextArea;
import javafx.stage.Stage;

public class Main extends Application {
    @Override // Override the start method in the Application class
      public void start(Stage primaryStage) {
        // Text area for displaying contents
        TextArea ta = new TextArea();
        // Create a scene and place it in the stage
        Scene scene = new Scene(new ScrollPane(ta), 450, 200);
        primaryStage.setTitle("Server"); // Set the stage title
        primaryStage.setScene(scene); // Place the scene in the stage
        primaryStage.show(); // Display the stage
        
        new Thread( () -> {
          try {
            // Create a server socket
            ServerSocket serverSocket = new ServerSocket(8000);
            Platform.runLater(() ->
              ta.appendText("Server started at " + new Date() + '\n'));
      
            // Listen for a connection request
            Socket socket = serverSocket.accept();
      
            // Create data input and output streams
            DataInputStream inputFromClient = new DataInputStream(
              socket.getInputStream());
            DataOutputStream outputToClient = new DataOutputStream(
              socket.getOutputStream());
      
            while (true) {
              // Receive input number from the client
              int inputNumber = inputFromClient.readInt();
              System.out.println("Input number received is:" + inputNumber + "\n");
              ta.appendText("The number recieved is:"+inputNumber+"\n  Sending result...\n");
              int flag = 1, n;
              n = inputNumber/2;
      
              // Check for prime
              if(inputNumber==0||inputNumber==1)
              {  
                flag=0;      
              }
              else
                  {  
                   for(int i=2;i<=n;i++)
                   {      
                    if(inputNumber%i==0)
                    {            
                     flag=0;
                     break;
                    }      
                   }    
                  }  
       
              // Send result back to the client
              outputToClient.writeInt(flag);
      
             /* Platform.runLater(() -> {
                ta.appendText("Radius received from client: " 
                  + radius + '\n');
                ta.appendText("Area is: " + area + '\n'); 
              });*/
            }
          }
          catch(IOException ex) {
            ex.printStackTrace();
          }
        }).start();
      }
      /**
       * The main method is only needed for the IDE with limited
       * JavaFX support. Not needed for running from the command line.
       */
      public static void main(String[] args) {
        launch(args);
      }
}

package application; //Client code starts here

import java.io.*;
import java.net.*;
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.ScrollPane;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;
public class Client extends Application {
  // IO streams
  DataOutputStream toServer = null;
  DataInputStream fromServer = null;
  @Override // Override the start method in the Application class
  public void start(Stage primaryStage) {
    // Panel p to hold the label and text field
    BorderPane paneForTextField = new BorderPane();
    paneForTextField.setPadding(new Insets(5, 5, 5, 5)); 
    paneForTextField.setStyle("-fx-border-color: green");
    paneForTextField.setLeft(new Label("Enter an integer: "));
    
    TextField tf = new TextField();
    tf.setAlignment(Pos.BOTTOM_RIGHT);
    paneForTextField.setCenter(tf);
    
    BorderPane mainPane = new BorderPane();
    // Text area to display contents
    TextArea ta = new TextArea();
    mainPane.setCenter(new ScrollPane(ta));
    mainPane.setTop(paneForTextField);
    
    // Create a scene and place it in the stage
    Scene scene = new Scene(mainPane, 450, 200);
    primaryStage.setTitle("Client"); // Set the stage title
    primaryStage.setScene(scene); // Place the scene in the stage
    primaryStage.show(); // Display the stage
    
    tf.setOnAction(e -> {
      try {
        // Get the radius from the text field
        int inputNumber = Integer.parseInt(tf.getText().trim());
  
        // Send the radius to the server
        toServer.writeInt(inputNumber);
        toServer.flush();
  
        // Get area from the server
        int flag = fromServer.readInt();
  
        // Display to the text area
        ta.appendText("The number input is " + inputNumber + "\n");
        
        if(flag==1)
        {
        ta.appendText(inputNumber + " is a prime number\n");
        }
        else
        {
        ta.appendText(inputNumber + " is not a prime number\n");
        }
      }
      catch (IOException ex) {
        System.err.println(ex);
      }
    });
  
    try {
      // Create a socket to connect to the server
      Socket socket = new Socket("localhost", 8000);
      // Socket socket = new Socket("130.254.204.36", 8000);
      // Socket socket = new Socket("drake.Armstrong.edu", 8000);
      // Create an input stream to receive data from the server
      fromServer = new DataInputStream(socket.getInputStream());
      // Create an output stream to send data to the server
      toServer = new DataOutputStream(socket.getOutputStream());
    }
    catch (IOException ex) {
      ta.appendText(ex.toString() + '\n');
    }
  }
  /**
   * The main method is only needed for the IDE with limited
   * JavaFX support. Not needed for running from the command line.
   */
  public static void main(String[] args) {
    launch(args);
  }
}

創建一個新客戶端並從一個新階段開始。

Client client = new Client();
Stage clientStage = new Stage();
clientStage.initOwner(primaryStage);
client.start(clientStage);

Main應用程序的start(Stage primaryStage)方法結束時執行此操作,它將在啟動時立即創建一個新客戶端 window。

除非您另外需要在完全不同的進程中從命令行單獨啟動客戶端,否則它不需要還具有主方法或子類應用程序 class。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM