Я скопирую его туда, поскольку кажется, что комментарии игнорируются в эти дни.
вы можете:
вместо метода, который выводит отладочную информацию в стандартный вывод, возвращается эта отладочная информация:
class ClientList {
Integer clients = 0;
public String debugClientList() {
return clients.toString();
}
и затем вызывая его из бобовой оболочки
print(clients.debugCientList());
выдаст вам вывод по вашему телнету
или, если вам нужен более похожий логгер, вам нужно напрямую взаимодействовать с объектом Interpreter
InterpreterSingleton {
public static final void Console console = new Interpreter();
}
....
class ClientList {
Integer clients = 0;
public void addClient(Client c) {
....
InterpreterSingleton.console.print("Client added, clients now are " + clients);
}
Я отвечаю там на комментарий, так как ему понадобится еще немного кодирования; Реализация telnet использует разные интерпретаторы для каждого соединения, поэтому вы должны предоставить этот интерпретатор объектам для печати клиенту telnet. Самый быстрый способ - это изменить бит на сервере telnet по умолчанию и использовать модифицированный для запуска сервера, вместо использования команды server () со сценарием (это соответствует условиям лицензии lgpl или sun)
обратите внимание, что таким образом для каждого соединения запускается интерпретатор; простое и быстрое решение - сохранить список всех работающих интерпретаторов и распечатать для каждого отладочную информацию, таким образом:
class InterpreterSingletonList {
public static final void Set<Interpreter> is = new HashSet();
void printToAll(String s) {
for (Interpreter i: is) {
i.print(s);
}
}
}
package bsh.util;
import java.io.*;
import java.net.Socket;
import java.net.ServerSocket;
import bsh.*;
/**
BeanShell remote session server.
Starts instances of bsh for client connections.
Note: the sessiond effectively maps all connections to the same interpreter
(shared namespace).
*/
public class Sessiond extends Thread
{
private ServerSocket ss;
NameSpace globalNameSpace;
public Sessiond(NameSpace globalNameSpace, int port) throws IOException
{
ss = new ServerSocket(port);
this.globalNameSpace = globalNameSpace;
}
public void run()
{
try
{
while(true)
new SessiondConnection(globalNameSpace, ss.accept()).start();
}
catch(IOException e) { System.out.println(e); }
}
}
class SessiondConnection extends Thread
{
NameSpace globalNameSpace;
Socket client;
SessiondConnection(NameSpace globalNameSpace, Socket client)
{
this.client = client;
this.globalNameSpace = globalNameSpace;
}
public void run()
{
try
{
InputStream in = client.getInputStream();
PrintStream out = new PrintStream(client.getOutputStream());
/* this is the one you're looking for */
Interpreter i = new Interpreter(
new InputStreamReader(in), out, out, true, globalNameSpace);
i.setExitOnEOF( false ); // don't exit interp
/*store the interpreter on the list*/
InterpreterSingletonList.is.add(i);
i.run();
/*remove it (i.run() blocks)*/
InterpreterSingletonList.is.remove(i);
}
catch(IOException e) { System.out.println(e); }
}
}