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

标签 java multithreading sockets io telnet

(请注意,SSH API 将无法工作,因为它用于 MUD 客户端,而且支持 SSH 的 MUD 不多,它们仍然使用 telnet。此外,在程序执行期间,不会关闭任何流。如果流关闭,则实际上结束了程序的运行。)

当我来到这个previously ,我有一个不同的组织,它为每个线程提供了对连接的引用。但是,那是使用 Apache TelnetClient (它有自己的优点和缺点),而这只是普通套接字。

此外,我正在尝试利用 multithreaded socket communicationtry 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/

相关文章:

阻塞调用的 C++ 数据超时

c++ - 将线程对象放入 vector 中,其中函数是成员函数并需要返回值

.net - 是否保证多个发送线程的 WCF TCP 消息顺序正确?

node.js - 带有Socket.IO的Google App Engine/计算引擎

java - 非法状态异常 : Expected BEGIN_OBJECT but was BEGIN_ARRAY

java - 了解@Nonnull和@CheckForNull注释

Java super() 继承

java - 如何在 XWPFTableCell 上设置自定义背景颜色?

multithreading - 如何最小化 tcp 服务器应用程序中使用的线程数?

c - 在 UDP 套接字上使用 write()/read()?