gpt4 book ai didi

java - TCP 聊天程序如何从同一个线程发送和接收数据?

转载 作者:可可西里 更新时间:2023-11-01 02:54:37 25 4
gpt4 key购买 nike

我注意到在一些用 Java 编写的 TCP 聊天程序的示例代码中,从客户端读取字符串和向服务器发送字符串都发生在 main 中。

例如,这是一个教程,其中我看不到输入线程和输出线程之间的区别... http://www.cise.ufl.edu/~amyles/tutorials/tcpchat/TCPChat.java

“BufferedReader 输入”和“PrintWriter 输出”都在同一线程中与 TCP 套接字一起使用。作为一个完全的新手,这让我感到困惑,因为以前,如果我有一些等待输入的东西,比如 C 中的“getch()”获取字符函数,那个东西会阻塞线程(除非它是一个事件或异常).通常,当我想象一个线程中的代码被执行时,我想象它是逐行执行的,偶尔会因异常和事件而跳转执行。但是写入流和从流中读取既不是异常也不是事件 - 我不知道如果主线程收到输入字符串并且应该同时发送输出字符串会做什么。流本身实际上是由其他线程或其他程序(如终端或操作系统)处理的吗?

我对此感到很奇怪,所以我将聊天程序分成两个单独的线程以使我感觉更舒服 - 一个线程用于从 TCP 套接字接收字符串,另一个线程用于通过同一套接字向外发送字符串。有人可以解释为什么我完全没有必要将输入和输出分成两个单独的线程吗?在有人因缺乏研究和理解而将其记下来之前,我已尽力阅读有关套接字的在线 Java 教程,并且我有写入和读取流(终端和纯文本文件)的经验。

最佳答案

 case CONNECTED:
try {
// Send data
if (toSend.length() != 0) {
out.print(toSend); out.flush();
toSend.setLength(0);
changeStatusTS(NULL, true);
}

// Receive data
if (in.ready()) {
s = in.readLine();
if ((s != null) && (s.length() != 0)) {
// Check if it is the end of a trasmission
if (s.equals(END_CHAT_SESSION)) {
changeStatusTS(DISCONNECTING, true);
}

// Otherwise, receive what text
else {
appendToChatBox("INCOMING: " + s + "\n");
changeStatusTS(NULL, true);
}
}
}
}
catch (IOException e) {
cleanUp();
changeStatusTS(DISCONNECTED, false);
}
break;

我从您提供的链接的“主要过程”中获取了这段代码片段。像你所说的那样停止线程继续的方法是 in.readLine();线程会一直等到有东西可以从输入流中读取,然后再继续。我想指出 if 语句“if(in.ready()) ” 通过在那里使用 if 语句,代码首先检查输入流是否有要读取的内容。否则,它会跳过它并继续。

关于java - TCP 聊天程序如何从同一个线程发送和接收数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20940353/

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