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 ?