如何在多线程程序中传递或共享开放流引用?
Posted
技术标签:
【中文标题】如何在多线程程序中传递或共享开放流引用?【英文标题】:how to pass or share open stream reference in a multithreaded program? 【发布时间】: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 次。当第一个线程(本地)读出来时,它不再可供第二个线程(远程)读取。 【参考方案1】:在主线程中打开一个套接字并将其设为全局,而不是将该套接字传递给一个新线程。 你可以这样做。
//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.
【讨论】:
以上是关于如何在多线程程序中传递或共享开放流引用?的主要内容,如果未能解决你的问题,请参考以下文章