作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
(请注意,SSH API 将无法工作,因为它用于 MUD 客户端,而且支持 SSH 的 MUD 不多,它们仍然使用 telnet。此外,在程序执行期间,不会关闭任何流。如果流关闭,则实际上结束了程序的运行。)
当我来到这个previously ,我有一个不同的组织,它为每个线程提供了对连接的引用。但是,那是使用 Apache TelnetClient (它有自己的优点和缺点),而这只是普通套接字。
此外,我正在尝试利用 multithreaded socket communication 的 try with resources
语句.似乎这个新的 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。
最佳答案
在主线程中打开一个套接字并使其成为全局的,而不是将该套接字传递给新线程。这就是您可以做到这一点的方法。
//Declare Socket socket.
main ()
{
//open socket
while(true)
{
//read a connection
//Creat a thread and Pass newly socket to thread.
}
}
run()
{
//Do your things here.
}
关于java - 如何在多线程程序中传递或共享开放流引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20544195/
我是一名优秀的程序员,十分优秀!