【发布时间】:2013-12-30 21:43:22
【问题描述】:
(注意,SSH API 不能工作,因为它是用于 MUD 客户端的,而且没有多少 MUD 支持 SSH,他们仍然使用 telnet。此外,在程序执行期间,不会关闭任何流。如果流关闭它,则有效地结束程序的运行。)
当我来到这个previously 时,我有一个不同的组织,它为每个线程提供了对连接的引用。但是,那是使用 Apache TelnetClient(它有自己的优点和缺点),而这只是普通的套接字。
另外,我正在尝试利用try with resources 声明multithreaded socket communication。似乎这个新的try 可能不允许以前的try 允许的某些组织?至少,到目前为止,我无法组织变量和线程,以便每个线程都有对所涉及的各种流的引用。
线程应该不相互阻塞。例如,无论输入什么,远程连接的输出都应该打印到控制台。同样,任何用户输入都应该被发送到远程连接。 (也许以后的版本会分屏输入输出。)
也许是父线程在它们之间传递消息(String 对象)?
远程线程工作正常,本地线程工作正常,但目前无法从本地线程向远程线程发送消息:
thufir@dur:~/NetBeansProjects/MudSocketClient$
thufir@dur:~/NetBeansProjects/MudSocketClient$ java -jar dist/MudSocketClient.jar
------------------------------------------------------------------------------
* Welcome to THE WEATHER UNDERGROUND telnet service! *
------------------------------------------------------------------------------
* *
* National Weather Service information provided by Alden Electronics, Inc. *
* and updated each minute as reports come in over our data feed. *
* *
* **Note: If you cannot get past this opening screen, you must use a *
* different version of the "telnet" program--some of the ones for IBM *
* compatible PC's have a bug that prevents proper connection. *
* *
* comments: jmasters@wunderground.com *
------------------------------------------------------------------------------
Press Return to continue:
you entered ""
hmm
you entered "hmm"
^Cthufir@dur:~/NetBeansProjects/MudSocketClient$
thufir@dur:~/NetBeansProjects/MudSocketClient$
文本永远不会到达远程连接。代码:
public class Telnet {
public static void main(String[] args) throws UnknownHostException, IOException {
final String host = "rainmaker.wunderground.com";
final int port = 3000;
Thread local = new Thread() {
@Override
public void run() {
Scanner scanner;
String line;
while (true) {
scanner = new Scanner(System.in);
line = scanner.nextLine();
out.println("\n\nyou entered\t\"" + line + "\"\n");
}
}
};
local.start();
Thread remote = new Thread() {
@Override
public void run() {
int byteOfData;
try (Socket socket = new Socket(host, port);
InputStream inputStream = socket.getInputStream();
OutputStream ouputStream = socket.getOutputStream();
PrintWriter printWriter = new PrintWriter(socket.getOutputStream(), true);
final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in))) {
while ((byteOfData = inputStream.read()) != -1) {
out.print((char) byteOfData);
}
} catch (Exception e) {
out.println(e);
}
}
};
remote.start();
}
}
这是一种穷人的 Telnet。
【问题讨论】:
-
您使用了断章取义的开头段落和指向另一个问题的链接,这使得这个问题很难作为一个独立的问题来阅读。可能值得编辑?目前还不是很清楚你的问题到底是什么。
-
嘿,很公平。我花了一段时间想出了那个!我一定会看看的。
-
您有 2 个线程都试图从 System.in 中读取数据。 System.in 实际上是一个 Stream,内容只能读取 1 次。当第一个线程(本地)读出来时,它不再可供第二个线程(远程)读取。
标签: java multithreading sockets io telnet