情况
我一直在创建一个程序来在 LAN 中的两台计算机之间交换消息。一台计算机将自己标识为服务器,而另一台计算机则是客户端。启动时,用户必须输入另一台计算机的主机和端口,如果他希望作为客户端连接到该计算机。它如何工作的设置非常基本:你输入你的信息,按回车键,它就会显示在你自己的屏幕上。之后,您的对话伙伴必须单击一个按钮以检索最新消息,并且它应该显示在他的屏幕上。这种情况一直持续到有人离开。
问题
程序正确启动并要求连接设置。之后,我在两台计算机上都启动了连接,一切似乎都很好(建立连接后,标签会显示您的状态,例如客户端或服务器,是 (1))。当我输入一条消息并发送它时,事情继续看起来很好,输出被写入发件人的屏幕并且没有发生意外行为。
当我想在另一台计算机上检索消息时,程序完全冻结。GUI 中没有可点击的对象,也没有显示输出。
代码
假设连接正确建立(参见 (1)),我将在下面概述发送消息的过程,同时省略非必要部分。
GuiApplication.java
private void sendMessage() {
connection.sendMessage(message);
showMessage(message);
}
Connection.java
public void sendMessage(String message) {
if (isClient()) {
client.sendMessage(message);
} else if (isServer()) {
server.sendMessage(message);
}
}
Client.java
public void sendMessage(String message) {
outbound = new PrintWriter(socket.getOutputStream(), true); // Defined outside this method
outbound.println(message);
}
发送消息的过程非常简单,但我想包含它以防我忽略了某些内容。
下面是我为检索新消息而创建的代码。这个概念很简单:我检查是否有任何新消息,如果有,我就检索它们。
GuiApplication.java
if (connection.hasNewMessage()) {
message = connection.retrieveMessage();
}
showMessage(message);
第一部分 ( connection.hasNewMessage()
) 将检查程序是否正在运行客户端或服务器并调用适当的retrieveMessage()
.
Client.java
public String retrieveMessage() throws IOException {
inbound = socket.getInputStream(); // Defined outside this method
return IOUtils.toString(inbound, "UTF-8");
}
起初我尝试BufferedReader
使用一个InputStreamReader
并调用该readLine()
方法,但是一旦我发现它不起作用(与我目前面临的问题相同)就决定尝试 commons.io 方法。
问题
现在已经很清楚了:为什么我的程序会在我单击检索新消息的按钮时挂起?
外部的
我不确定它是否不受欢迎,但如果您想要更好的概述,这里是github 存储库,尽管我相信必要的代码剪辑器在那里。