Wiele wątków jak się do nich odwoływać i ich zmiennych.

0

Witam!

Piszę aplikacje serwer - klient na socketach i wątkach.

Z klienta wysyłam polecenie uruchomienia innej aplikacji w wątku.

 	
public void run()
	{
		try 
		{
			Process runtime = Runtime.getRuntime().exec("java -jar aplakacja.jar", null, new File("/home"));
		} 
		catch (IOException e) 
		{
			e.printStackTrace();
		}    
	}

Aplikacja działa w wątku w tle i drukuje swoją konsolę.

Chce teraz napisać inną metodę która odwoła się do tego wątku (wątków z tą aplikacją może być równocześnie kilka) i chce przekazywać do klienta konsolę programu

                       DataOutputStream out = new DataOutputStream(server.getOutputStream());
			BufferedReader in = new BufferedReader(new InputStreamReader(runtime.getInputStream()));
			String line;
			while ((line = in.readLine()) != null) {
				out.writeUTF(line);
			}
		    server.close();

Jednak nie wiem jak odwołać się do wątku i runtime zawartym w tym wątku.

0

Sam jesteś wątek.
http://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html#exec(java.lang.String)

Executes the specified string command in a separate process.

Więc czy chciałeś żeby to był faktycznie wątek?

0

To jest tylko część kodu który wykonywany jest w Thread.

Ehh Zaraz dodam cały kod

0
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.net.ServerSocket;
import java.net.Socket;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Random;

public class MineSocket
{
	public static void main(String[] args)
	{
		if(args.length != 1)
		{
			System.out.println("Komenda: Server.jar <port>");
		}
		else
		{
			int port = Integer.parseInt(args[0]);
			new MineSocketServer(port).start();
		}
	}
	
}	

class Install extends Thread
{
	private String args[];
	
	public Install(String[] args) {
		this.args = args;
	}

	public String pass()
	{
		Random rand = new Random();
		
		char[] values1 = {'w','e','l','c','s','p','a','m','S','M','A','H','E','V'};
	    char[] values2 = {'@','&','$','#','%','*'};
	    char[] values3 = {'1','2','3','4','5','6','7','8','9','0'};
	    
	    String out1="";
	    String out2="";
	    String out3="";
	    String out4="";
	    String out5="";
	    String out6="";
	    String out="";
	    
	    for (int i=0;i<3;i++)
	            {
	             	int idx=rand.nextInt(values1.length);
	             	out1+= values1[idx];
	            }
	 
	    for (int i=0;i<2;i++)
	            {
	    			int idx=rand.nextInt(values2.length);
	    			out2+= values2[idx];
	            }
	 
	    for (int i=0;i<1;i++)
	            {
	    			int idx=rand.nextInt(values3.length);
	    			out3+= values3[idx];
	            }
	    for (int i=0;i<3;i++)
		        {
		         	int idx=rand.nextInt(values1.length);
		         	out4+= values1[idx];
		        }

	    for (int i=0;i<2;i++)
		        {
					int idx=rand.nextInt(values2.length);
					out5+= values2[idx];
		        }

	    for (int i=0;i<1;i++)
		        {
					int idx=rand.nextInt(values3.length);
					out6+= values3[idx];
		        }
	 
	    out = out1.concat(out2).concat(out3).concat(out4).concat(out5).concat(out6);
	    return out;
	}
	
	public void run()
	{
		 try 
		 {
		
			 Connection sql = DriverManager.getConnection("DANE UKRYTE");
			 Statement stat = sql.createStatement();
	         stat.execute("USE craftfield");
			 ResultSet sprawdz = stat.executeQuery("SELECT  nick FROM  `mysql` WHERE  `nick` = '"+args[3]+"'");
	         if(!sprawdz.first())
	         {
				 String pass = pass();
				 stat.execute("CREATE USER '"+args[3]+"'@'%' IDENTIFIED BY  '"+pass+"'");
				 stat.execute("GRANT USAGE ON * . * TO  '"+args[3]+"'@'%' IDENTIFIED BY  '"+pass+"'");
				 stat.execute("CREATE DATABASE IF NOT EXISTS  `"+args[3]+"` ");
				 stat.execute("GRANT ALL PRIVILEGES ON  `"+args[3]+"` . * TO  '"+args[3]+"'@'%'");  
		         stat.execute("USE craftfield");  
				 stat.execute("INSERT INTO `mysql`(`nick`, `password`) VALUES ('"+args[3]+"','"+pass+"')");
				 Runtime.getRuntime().exec("mkdir "+args[3]);
				 Runtime.getRuntime().exec("cp minecraft.jar "+args[3]+"/minecraft.jar");
			}
		 } 
		 catch (IOException e) 
		 {
			 e.printStackTrace();
		 }
		 catch (SQLException e) 
		 {
			 e.printStackTrace();
		 }
	}
}

class Start extends Thread
{
	private String args[];
	private Socket server;

	public Start(String[] args, Socket server) {
		this.args = args;
		this.server = server;
	}
	
	public void run()
	{
		try 
		{
			Process runtime = Runtime.getRuntime().exec("java -jar minecraft.jar", null, new File("/home/"+args[3]));
			DataOutputStream out = new DataOutputStream(server.getOutputStream());
			BufferedReader in = new BufferedReader(new InputStreamReader(runtime.getInputStream()));
			String line;
			while ((line = in.readLine()) != null) {
				out.writeUTF(line);
			}
		    server.close();
		} 
		catch (IOException e) 
		{
			e.printStackTrace();
		}    
	}
}

class MineSocketServer extends Thread
{
	private ServerSocket serverSocket;
	private int port;
	private String encoding;
	
	public void printutf(String args)
	{
		this.encoding="UTF-8";
		try {
			PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out, this.encoding), true);
			out.println(args);
		} 
		catch (UnsupportedEncodingException e) 
		{
			e.printStackTrace();
		}
	}

	public MineSocketServer(int port) 
	{
		this.port = port;
	}

	public String[] cut(String slowo)
	{
		 int temp = 0;
		 int j = 0;
		 int length = 1;
		 for(int i=0;i<slowo.length();i++)
		 {
			
			 if((slowo.substring(i, i+1)).equals(","))
			 {
				 length++;
			 }
		 }
		 String slowa[] = new String[length];
		 for(int i=0;i<slowo.length();i++)
		 {
			
			 if((slowo.substring(i, i+1)).equals(","))
			 {
				 slowa[j] = slowo.substring(temp, i);
				 j++;
				 temp = i+1;
			 }
			 if(i==slowo.length()-1)
			 {
				 slowa[j] = slowo.substring(temp);
			 }
		 }
		return slowa;
	}

	public void run() 
	{
		try {
			serverSocket = new ServerSocket(port);
		} 
		catch (IOException e) 
		{
			e.printStackTrace();
		}
		printutf("Uruchomiono serwer na porcie "+serverSocket.getLocalPort());
		printutf("Czekam na połączenia");
		while(true)
		{
			try
			{	
				Socket server = serverSocket.accept();
				DataInputStream in = new DataInputStream(server.getInputStream());
				
				String args[] = cut(in.readUTF());
	
				if(args[0].equals("booblefish"))
				{
					if(args[1].equals("install"))
					{
						printutf("Polecenie instalacji Serwera "+args[3]+" od klijenta "+server.getRemoteSocketAddress());  
						Thread thread = new Thread(new Install(args), "install");
						thread.start();
					}
					else if(args[1].equals("start"))
					{
						printutf("Polecenie uruchomienia Serwera "+args[3]+" od klijenta "+server.getRemoteSocketAddress());  
						Thread thread = new Thread(new Start(args, server), "install");
						thread.start();
					}
					else
					{
						printutf("Nie znana komenda");
					}
				}
				else
				{
					printutf("Złe hasło od klienta "+server.getRemoteSocketAddress()+" Nazwa: "+args[3]+" ID: "+args[2]);
				}
			}
			catch(IOException e)
			{
				e.printStackTrace();
				break;
			}
		}
	}
}

Klient wysyła dane "hasło,komenda,id,nazwa"

Chce żeby po wysłaniu "hasło,consola,id,nazwa"

Program odniósł się do odpowiedniego wątku i zaczął wysyłać konsolę serwera do clienta.

Może lepiej przejść na screen w linuxach ?

0

Próbowałem ze screen ale niestety java zwraca mi że screen nie jest uruchomiony w terminalu.
Jak uruchomić komende screen -r w Runtime?

0

uruchamiasz osobny jvm wiec mozesz jedynie odczytywac stdout`a, jakis plik tymczasowy z zapisem serializowanego modelu etc

0

Chodzi mi żeby nazwać jakiś te thready i w dowolnym momencie odwołać się do któregoś i pobierać konsole tego serwera

0

Dopóki nie zrozumiesz czym różni się wątek od procesu nie ma sensu ciągnąć tego tematu.

0

A co Ty na to żeby użyć map ? HashMap albo samo Map ? Kluczem byłaby nazwa, a wartością wątek np.
(kod tak na szybko szczegoly musisz sam dopracować ;P)

HashMap map = new HashMap();
Thread thread = new Thread(new Start(args, server), "install");
map.put(thread.getName(), thread );

Dzięki temu masz szybki dostęp do wątkow, Możesz je wywoływać poprzez nazwy i odwoływać się do nich.
Oczywiście jak chcesz zmienić nazwę to dajesz thred.setName(String s); ;P

0

Ciekawy pomysł ju kiedyś używałem map. Czyli jak przypisie do mapy nazwę, thread to odwołując się do tread zapisanym pod nazwą mogę z niego korzystać. Ciekawe zaraz zaprogramuje i sprawdzę to czy działa tak jak powinno :)

0
Shalom napisał(a):

Dopóki nie zrozumiesz czym różni się wątek od procesu nie ma sensu ciągnąć tego tematu.

Program który jest procesem ma wątek główny + wątki uruchamiające serwery. Uruchomione serwery są procesem (w systemie są widoczne pod własnym PIDem). Dobrze rozumiem?
Teraz mam pytanie czy jak uruchomi się już serwer (minecraft.jar) to czy wątek nadal istnieje?

evan napisał(a):

uruchamiasz osobny jvm wiec mozesz jedynie odczytywac stdout`a, jakis plik tymczasowy z zapisem serializowanego modelu etc

Dokładnie o to mi chodzi aby odczytywać strumień tego uruchomionego jara. Ewentualnie potem wysyłać komendy do serwera.

0

Tutaj masz cos co powinno pomoc Ci w Mapach:
http://docs.oracle.com/javase/tutorial/collections/interfaces/map.html

0

Dziękuję za pomoc.

HashMapa

HashMap<String, Process> map = new HashMap<String, Process>();

Załatwiła sprawę i wszystko działa mogę teraz szybko po Nazwie HashMapy pobierać konsolę serwera (to co wypluwa zewnętrzny jar);

1 użytkowników online, w tym zalogowanych: 0, gości: 1