Witam!
Chcę zrobić server, który ma 3 wątki - jeden czeka na połączenie klienta aby przekazać obraz, drugi czeka na sygnał wyłączenia X, trzeci czeka na połączenia klienta aby wysłać uruchomione procesy. Niestety nie działa mi to w jednym czasie - tylko wchodzi w pierwszy wątek - czekanie dla wysłania procesów. Jak to naprawić?
Kod:
package displayserver;
import java.net.*;
import java.io.*;
import java.awt.*;
import java.util.*;
import java.util.List;
public class DisplayServer extends Thread {
ServerSocket ss = null;
ServerSocket admin = null;
ServerSocket proc = null; // do procesów
Vector<ClientThread> clientList = new Vector<ClientThread>();
long sleepInterval = 125;
public DisplayServer(long interval) throws Exception {
ss = new ServerSocket(2020);
admin = new ServerSocket(2021);
proc = new ServerSocket(2022); // socket do procesów
sleepInterval = interval;
this.setPriority(MIN_PRIORITY);
this.start();
startProc();
startServer();
}
private void startServer() {
Socket client = null;
System.err.println("Video czeka na klienta");
ClientThread ct = null;
while (true) {
try {
client = ss.accept();
ct = new ClientThread(client);
clientList.addElement(ct);
ct.start();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
private void startProc() {
Socket client = null;
System.err.println("Czekanie na żądanie procesów");
ProcThread pt = null;
while (true) {
try {
client = proc.accept();
pt = new ProcThread(client);
pt.start();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
public void run() {
String localHost = "127.0.0.1";
try {
localHost = InetAddress.getLocalHost().getHostAddress();
} catch (Exception ex) {
}
while (true) { // zamykanie serwera przy otrzymaniu X
try {
Socket ad = admin.accept();
if (ad.getInetAddress().getHostAddress().equals(localHost)
&& ad.getInputStream().read() == 'X') {
ss.close();
for (int i = 0, n = clientList.size(); i < n; i++)
clientList.get(i).client.close();
System.exit(0);
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
private void removeMe(Socket s) {
clientList.removeElement(s);
}
class ClientThread extends Thread {
Socket client = null;
ObjectOutputStream os = null;
InputStream is = null;
public ClientThread(Socket s) {
client = s;
try {
os = new ObjectOutputStream(s.getOutputStream());
is = s.getInputStream();
System.out.println("Client from "
+ s.getInetAddress().getHostAddress() + " connected");
} catch (Exception ex) {
ex.printStackTrace();
}
}
public void run() {
java.awt.image.BufferedImage img = null;
Robot r = null;
try {
r = new Robot();
} catch (Exception ex) {
ex.printStackTrace();
}
Dimension size = Toolkit.getDefaultToolkit().getScreenSize();
Rectangle rect = new Rectangle(0, 0, size.width, size.height);
javax.swing.ImageIcon icon = null;
while (true) {
try {
System.gc();
img = r.createScreenCapture(rect);
icon = new javax.swing.ImageIcon(img);
os.writeObject(icon);
os.flush();
icon = null;
System.gc();
try {
Thread.currentThread().sleep(sleepInterval);
} catch (Exception e) {
}
} catch (Exception ex) {
closeAll();
break;
}
}
}
private void closeAll() {
DisplayServer.this.removeMe(client);
try {
os.close();
is.close();
client.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
public static void main(String arg[]) throws Exception {
long interval = 80;
if (arg.length == 1)
interval = Long.parseLong(arg[0]);
new DisplayServer(interval);
}
class ProcThread extends Thread {
Socket client = null;
ObjectOutputStream oos = null;
InputStream is = null;
ObjectInputStream ois = null;
public ProcThread(Socket s) {
client = s;
try {
ois = new ObjectInputStream(client.getInputStream());
oos = new ObjectOutputStream(client.getOutputStream());
} catch (Exception ex) {
ex.printStackTrace();
}
}
public void run() {
while (true) {
try {
String message = (String) ois.readObject();
List<String> processes = listRunningProcesses();
String result = "";
Iterator<String> it = processes.iterator();
while (it.hasNext()) {
result += it.next() + "\n";
}
// write object to Socket
oos.writeObject(result);
// close resources
ois.close();
oos.close();
client.close();
} catch (Exception ex) {
//closeAll();
break;
}
}
}
}
// lista procesów
public static List<String> listRunningProcesses() {
List<String> processes = new ArrayList<String>();
try {
String line;
Process p = Runtime.getRuntime().exec("tasklist.exe /fo csv /nh");
BufferedReader input = new BufferedReader
(new InputStreamReader(p.getInputStream()));
while ((line = input.readLine()) != null) {
if (!line.trim().equals("")) {
// keep only the process name
line = line.substring(1);
processes.add(line.substring(0, line.indexOf("\"")));
}
}
input.close();
}
catch (Exception err) {
err.printStackTrace();
}
return processes;
}
}