试图从文本字段中获取数据以输出Java聊天程序的数据流



我正在用Java编写一个简单的GUI聊天程序。目标是让用户选择是托管服务器还是作为客户端进行连接。所有这些都有效。我遇到的问题是让客户端或服务器聊天。理想情况下,用户或服务器可以在textField中键入并点击回车键(或按下发送按钮),然后消息将发送到连接的每个客户端。在执行过程中,服务器运行一个无限while循环,等待更多的客户端。我遇到的问题有两方面: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("");
}
}

我想我的问题是:我如何重新排列我的方法,以便服务器可以等待来自客户端的文本,然后将其发送回所有客户端?以及,如何将文本从客户端发送到服务器?

在这个代码的问题中:

  1. 您一直在创建客户端和服务器。你当然应该每个只做一个吗?

  2. 您正在事件线程上执行阻塞网络操作,而不是在单独的线程中执行。

  3. 您正在通过while(true)在EOS循环。。。如果在.hasNext()中。这应该是while(在.hasNext()中)…

  4. 你接受了一个套接字,但显然没有用它做任何事情。看起来你一次只能处理一个客户端。您应该启动一个新线程来处理每个接受的套接字。

最新更新