0

我正在用 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("");
        }
    }

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

4

1 回答 1

0

这段代码的问题包括:

  1. 您不断创建客户端和服务器。当然,您应该只做一个吗?

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

  3. 您正在通过 while (true) ... if in.hasNext() 在 EOS 上循环。这应该是 while (in.hasNext()) ...

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

于 2012-12-03T03:59:46.457 回答