gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:06:42 25 4
gpt4 key购买 nike

(请注意,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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com