1

2 つのファイル (クライアントとサーバー) のコードを 1 つにマージすると、コントロールはクライアント コードに到達しなくなります。ただし、サーバー コードをバックグラウンドで実行してから、クライアント コードを実行する必要があります。

これが私のコードです:

 //Server code 

 try {
        ServerSocket serverSocket = null; 

    try { 
         serverSocket = new ServerSocket(10007); 
        } 
    catch (IOException e) 
        { 
         System.err.println("Could not listen on port: 10007."); 
         System.exit(1); 
        } 

    Socket clientSocket = null; 
    System.out.println ("Waiting for connection.....");

    try { 
         clientSocket = serverSocket.accept(); 
        } 
    catch (IOException e) 
        { 
         System.err.println("Accept failed."); 
         System.exit(1); 
        } 

    System.out.println ("Connection successful");
    System.out.println ("Waiting for input.....");

    PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), 
                                      true); 
    BufferedReader in = new BufferedReader( 
            new InputStreamReader( clientSocket.getInputStream())); 

    String inputLine; 

    while ((inputLine = in.readLine()) != null) 
        { 
         System.out.println ("Server: " + inputLine); 
         out.println(inputLine); 

         if (inputLine.equals("Bye.")) 
             break; 
        } 

    out.close(); 
    in.close(); 
    clientSocket.close(); 
    serverSocket.close(); 

  //Client code 
        String serverHostname = new String ("127.0.0.1");
        System.out.println ("Attemping to connect to host " +
                serverHostname + " on port 10007.");
        Socket echoSocket = null;
        try {
            echoSocket = new Socket(serverHostname, 10007);
            out = new PrintWriter(echoSocket.getOutputStream(), true);
            in = new BufferedReader(new InputStreamReader(
                                        echoSocket.getInputStream()));
        } catch (UnknownHostException e) {
            System.err.println("Don't know about host: " + serverHostname);               
        } catch (IOException e) {
            System.err.println("Couldn't get I/O for "
                               + "the connection to: " + serverHostname);              
        }

        BufferedReader stdIn = new BufferedReader(
                                   new InputStreamReader(System.in));
        String userInput;

        System.out.print ("input: ");           
            while ((userInput = stdIn.readLine()) != null) {
                out.println(userInput);
                System.out.println("echo: " + in.readLine());
                System.out.print ("input: ");
            }
        out.close();
        try {
            in.close();           
            stdIn.close();           
            echoSocket.close();
        } catch (IOException ex) {
            Exceptions.printStackTrace(ex);
        }

サーバー コードをバックグラウンドで実行してからクライアント コードを実行する方法がわかりません。

4

3 に答える 3

0

技術的には、このようなサーバーコードを呼び出すスレッドをインスタンス化することで、これをすべて1つのソースファイルで行うことができます。

    // Start the Server
    new Thread(new Runnable() {
        public void run() {
            // .. all the server code
        }
    }).start();

    // Start the client

    // .. all the client code

舞台裏では、Javaはおそらく新しいRunnable(){}テクニックのようなもののために匿名の内部クラスを作成しています。

于 2012-11-08T23:11:58.507 に答える
0

2つのクラスを作成する必要があります。

  • 1人のクライアント
  • 1台のサーバー

それぞれに独自のmain()メソッドがあります。

このように、2つのJVMの1つのサーバー、1つのクライアントを起動できます

または1つのクラスで:

実装する2つの静的内部クラスを作成し、Runnable両方をメインクラスの内部から開始します:(ここでは、メインクラスがスターターと呼ばれると仮定しています)

public static main(String args [ ]) {
                new Thread(new Starter.Server()).start();
                new Thread(new Starter.Client()).start();
            }

クリーンアップコードを実行させます...

于 2012-11-08T19:15:04.623 に答える
0

メインクラスpublic static class Client内でネストされたを使用します。Serverそれぞれが独自のmainメソッドを持つことができるため、これは 1 つのファイルですべてを達成するための方法ですが、2 つの別個のエントリ ポイントです。

もう 1 つの選択肢は、エントリ ポイントを 1 つにして、クライアント用とサーバー用の 2 つのスレッドを開始させることです。

于 2012-11-08T19:22:48.213 に答える