如何在多线程程序中传递或共享开放流引用?

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.

【讨论】:

以上是关于如何在多线程程序中传递或共享开放流引用?的主要内容,如果未能解决你的问题,请参考以下文章

如何保护可能在多线程或异步环境中使用的资源?

在JAVA中ArrayList如何保证线程安全

如何在多线程或基于 wcf 服务的应用程序中正确使用事件?

如何在多线程中将指针传递给子类 Qthread

大疆面试整理

如何在php中跨线程共享全局变量?