簡體   English   中英

如何從線程的run方法內部的單獨文件訪問和/或讀取命令行參數(Java套接字編程)

[英]How to access and/or read command line arguments from a separate file inside the run method of a thread (java socket programming)

我正在嘗試使用三個文件(主功能文件,服務器文件,客戶端文件)創建程序

我現在只關注主文件和服務器文件。

如果存在以下命令行參數,則該程序將作為服務器運行:

java DirectMessengerCombined -l 3000

如果“ -l”不存在,它將作為客戶端運行

在服務器文件中,有兩個用於兩個單獨線程的單獨運行方法(一個用於接收消息,一個用於發送消息)(不確定如何解決方法名稱“運行”在程序中出現兩次這一事實)

主要功能文件是包含(String args [])命令行參數的文件

我正在嘗試在兩個服務器線程運行方法中訪問args []。

主要功能文件代碼:

import java.io.IOException;
public class DirectMessengerCombined
{
    public static void main(String[] args) throws IOException
    {
        DirectMessengerClient Client1 = new DirectMessengerClient();
        DirectMessengerServer Server1 = new DirectMessengerServer();
        //DirectMessengerServer Server1 = new DirectMessengerServer(args[1], null, 0);
          for (int i = 0; i < args.length; i++)
          {
                if(!args[0].equals("-l"))
                {
                    Client1.ClientRun(args);
                }
                switch (args[0].charAt(0))
                {
                    case '-':
                    if(args[0].equals("-l"))
                    {   
                        Server1.ServerRun(args);
                    }

                }
           i=args.length + 20;
          } 
    }

}

如您所見,“ args”在代碼行中傳遞,該行顯示:

 Server1.ServerRun(args);

在下面的代碼中,開頭為“ ServerRun”的方法可以訪問實際的命令行參數(來自傳入的參數“ String [] args”)。 我希望能夠使用和/或訪問ServerRun方法參數中的“ String args []”,以在單獨的運行方法中使用以獲得端口號。

服務器代碼:

import java.io.*;
import java.net.*;
import java.util.*;
import javax.imageio.IIOException;
public class DirectMessengerServer
{
    private static Socket socket;
    boolean KeepRunning = true;

    void ServerRun(String[] args) 
    {
          //How do I get the String[] args in this method be able to access it in the run methods?

    }
    Thread ServerRecieve = new Thread();
    Thread ServerSend = new Thread ();
    //Run method of ServerSend
    public void run()
    {   
        System.out.println("Server sending thread is now running");
        try
        {         

            //Send the message to the server
            OutputStream os = socket.getOutputStream();
            OutputStreamWriter osw = new OutputStreamWriter(os);
            BufferedWriter bw = new BufferedWriter(osw);

            //creating message to send from standard input
            String newmessage = "";
            try 
            {
                // input the message from standard input
                BufferedReader input= new BufferedReader( 
                new InputStreamReader(System.in));
                String line = "";

                line= input.readLine(); 
                    newmessage += line + " ";

            }
            catch ( Exception e )
            {
                System.out.println( e.getMessage() );
            }
            String sendMessage = newmessage;
            bw.write(sendMessage + "\n");
            bw.flush();
            System.out.println("Message sent to client: "+sendMessage);

            }

            catch (IOException e) 
            {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        finally
        {

        }
  //  }
    }

//run method of ServerRecieve
public void run(String args[])
{   
    System.out.println("Server recieve thread is now running");
    try
    {
        System.out.println("Try block begins..");
        int port_number1= Integer.valueOf(args[1]);
        System.out.println("Port number is: " + port_number1);
        ServerSocket serverSocket = new ServerSocket(port_number1);
        //SocketAddress addr = new InetSocketAddress(address, port_number1);
        System.out.println( "Listening for connections on port: " + ( port_number1 ) );

        while(KeepRunning)
        {
            //Reading the message from the client

            socket = serverSocket.accept();    
            InputStream is = socket.getInputStream();
            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader br = new BufferedReader(isr);
            String MessageFromClient = br.readLine();
            System.out.println("Message received from client: "+ MessageFromClient);


        }
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    finally
    {
        try {
            socket.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
}

我的問題是,如何從ServerRun參數內部獲取string [] args,並將其存儲在程序稍后的單獨運行方法中使用的某個位置?

為了回答有關如何在該類的另一種方法中訪問args特定問題,將執行以下操作。

我建議將args參數移至構造函數,而不要通過方法調用,如此處所示。 當然,方法可以設置實例變量,但是實例變量不能是最終變量。 我認為,由於變量不需要更改引用,因此final是最合適的方法。

public class DirectMessengerServer
{
  private final String[] serverArgs; // <-- added variable
  private static Socket socket;
  boolean keeyRunning = true;

  public DirectMessengerServer(String[] args)
  {
      // set the instance variable
      this.serverArgs = args;
  }


  public void run()
  {
      // access the serverArgs instance variable
      System.out.println(serverArgs[0]);
  }


//
// from the dirver program    
//
public static void main(String[] args)
{
    // after verifying the args as desired
    DirectMessengerServer server1 = new DirectMessengerServer(args);

}

暫無
暫無

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

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