我正在用 Java 开发一个简单的 GUI 聊天程序。目标是让用户选择是托管服务器还是作为客户端连接。所有这些都有效。我遇到的问题是让客户端或服务器聊天。理想情况下,用户或服务器可以在 textField 中输入并按回车键(或按发送按钮),然后消息将发送到连接的每个客户端。在执行期间,服务器会运行一个无限循环,等待更多的客户端。我遇到的问题有两个:1)我不确定将字符串传递给输入流的方式是否正确,2)我不知道什么时候可以让服务器接收然后重新发送数据,因为它在等待server.accept()
。
这是运行方法:
public void run()
{
conversationBox.appendText("Session Start.\n");
inputBox.requestFocus();
while (!kill)
{
if (isServer)
{
conversationBox.appendText("Server starting on port " + port + "\n");
conversationBox.appendText("Waiting for clients...\n");
startServer();
}
if (isClient)
{
conversationBox.appendText("Starting connection to host " + host + " on port " + port + "\n");
startClient();
}
}
}
这是 startClient 方法:
public void startClient()
{
try
{
Socket c = new Socket(host, port);
in = new Scanner(c.getInputStream());
out = new PrintWriter(c.getOutputStream());
while (true)
{
if (in.hasNext())
{
Chat.conversationBox.appendText("You Said: " + message);
out.println("Client Said: " + message);
out.flush();
}
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
这是 startServer 方法:
public void startServer()
{
try
{
server = new ServerSocket(port);
while (true)
{
s = server.accept();
conversationBox.appendText("Client connected from " + s.getLocalAddress().getHostName() + "\n");
}
}
catch (Exception e)
{
conversationBox.appendText("An error occurred.\n");
e.printStackTrace();
isServer = false;
reEnableAll();
}
}
最后,这是我获取数据并(尝试)将其写入输出流的 actionPerformed 部分:
if (o == sendButton || o == inputBox)
{
if(inputBox.getText() != "")
{
out.println(inputBox.getText());
inputBox.setText("");
}
}
我想我的问题是:如何重新安排我的方法,以便服务器可以等待来自客户端的文本,然后将其发送回所有客户端?而且,如何将文本从客户端发送到服务器?