[英]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.