【问题标题】:Read input from chat window从聊天窗口读取输入
【发布时间】:2015-06-27 21:14:03
【问题描述】:

所以我们的老师试图帮助并为我们的聊天服务器/客户端任务编写 GUI,但我不知道如何从 GUI 读取输入。无论我输入什么,都只是坐在那里,直到我输入一些东西。我无法弄清楚如何阅读它。在一天的大部分时间里,我一直被困在这一部分上,我要放弃了。我将发布课程,我不希望代码中提出问题的答案,我只需要能够让我在文本框中输入的任何内容都能被阅读!剩下的我可以解决!我以为连接部分会是最难的,没想到输入是个问题:/

服务器类

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class Server
{

private static final int PORT = 8889;
private static ServerSocket server;
public static int connections;

public static void main(String[] args) throws IOException
{
    server = new ServerSocket(PORT);

    System.out.println("Waiting for clients to connect...");

    Socket clientConnection;
    while (true)
    {
        if (connections >=5)
        {
            clientConnection = server.accept();
            System.out.println("No more connections can be made at this time.You will be disconnected.");
            server.close();
        }

        else {
        clientConnection = server.accept();
        //CommandHandler handler = new CommandHandler(clientConnection);
        System.out.println("Client connected.");
        connections += 1;
        System.out.println("There are " + connections + "user(s) at this time");
        //Thread t = new Thread(handler);
        //t.start();
        }
    }
}
}

客户端类

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

public class ChatClient
{
public static final String HOST= "localhost";
public static final int PORT = 8889;

private ChatWindow window;
private Socket connection;


public ChatClient()
{   
    this.window = new ChatWindow(this);

    try {
        Socket serverConnection = null;
        try {
            serverConnection = new Socket(HOST, PORT);
            ObjectInputStream reader = new ObjectInputStream(
                    serverConnection.getInputStream());
            PrintWriter writer = new PrintWriter(
                    serverConnection.getOutputStream());

            } finally {
            serverConnection.close();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}




public void sendMessage(String message)
{   
    //TODO - USE THE OUTPUT STREAM TO WRITE THE MESSAGE TO THE SERVER
    //       THIS METHOD IS INVOKED BY THE window WHEN THE USER ENTERS
    //       TEXT TO SEND TO THE CHAT SERVER


}


private void start()
{           
    //TODO - ADD CODE THAT WILL CONTINUOUSLY READ
            //       MESSAGES FROM THE SERVER  
            //       USE THE window.printMessage() TO DISPLAY
            //       THE MESSAGE IN THE CHAT WINDOW
}   




public static void main(String[] args)
{
    ChatClient chatClient = new ChatClient();
    chatClient.start();

}

}

聊天窗口类

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.text.BadLocationException;
import javax.swing.text.DefaultCaret;

@SuppressWarnings("serial")
public class ChatWindow extends JFrame
{

private ChatClient client;

private JTextArea messageArea = new JTextArea(10, 32);
private JTextField inputArea = new JTextField(32);

public ChatWindow(ChatClient theClient)
{
    this.client = theClient;

    //when the user closes the window, make sure the user is logged out.
    addWindowListener(new WindowAdapter()
    {
        public void windowClosing(WindowEvent e)
        {
            try {
                client.sendMessage("LOGOUT");
            } catch (Exception e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
        }
    });

    // GUI COMPONENTS ------------------------------------------

    // MESSAGE AREA: All messages from all clients are displayed here
    messageArea.setEditable(false);
    messageArea.setBackground(Color.LIGHT_GRAY);
    messageArea.setLineWrap(true);

    // make sure the scroll bar stays are the bottom
    DefaultCaret caret = (DefaultCaret) messageArea.getCaret();
    caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);

    // INPUT AREA: Input area where client enters text message
    // The message is sent when the user presses enter
    inputArea.addActionListener(new InputAreaActionListener());

    Container content = getContentPane();
    content.add(new JScrollPane(messageArea), BorderLayout.CENTER);
    content.add(inputArea, BorderLayout.SOUTH);

    setTitle("Chat Client");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    pack();
    inputArea.requestFocusInWindow();
    setVisible(true);
}

/**
 * 
 * This method adds the message to the end of the message area followed by a
 * new line character.
 * 
 * @param message
 */
public void printMessage(String message)
{
    messageArea.append(String.format("%s\n", message));
    try
    {
        messageArea.setCaretPosition(messageArea.getLineStartOffset(messageArea.getLineCount() - 1));
    }
    catch (BadLocationException e)
    {
        e.printStackTrace();
    }
}


private class InputAreaActionListener implements ActionListener
{
    @Override
    public void actionPerformed(ActionEvent e)
    {
        String command = e.getActionCommand();

        // ask the chat client to send the message to the server
        try {
            client.sendMessage(command);
        } catch (Exception e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }

        inputArea.setText("");
        inputArea.requestFocusInWindow();
    }
}

}

我觉得这很简单,也许我只是看得太难或太长了。我们很乐意接受任何帮助或批评。任何类都可以修改,除了聊天窗口类:/

【问题讨论】:

  • 看起来sendMessage(String message) in Client 将输入作为参数。除了弄清楚如何将message 发送到服务器之外,您不需要做任何事情。
  • 那么使用输出流来获取输入并将其更改为参数然后发送到服务器?
  • .....是的,但是您需要将它们转换为您的班级的成员变量。现在,它们在构造函数中被定义为局部变量,并在完成后被销毁。
  • 看到这就是我的想法,但他以一种有趣的方式设置了起始代码,这就是他希望构造函数的设置方式。 //TODO - 连接到服务器。// 建立输入和输出流 // 需要向服务器写入消息和 // 从服务器读取消息
  • 这正是你正在做的,只需将你的局部变量变成成员变量(即将它们的声明移到private JTextField inputArea = new JTextField(32);旁边)。

标签: java user-interface input client-server


【解决方案1】:

您必须实现 sendMessage 函数,就像 TODO 消息说您可以使用类 OutputStream,在这种情况下,是 PrintWriter 实例,如下所示:

PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
out.println(message);

这样你就可以实现通过客户端发送消息了。

【讨论】:

  • 好的,我实现了,现在它在第 45 行为客户端抛出空指针异常。我尝试抛出 IO 异常并使用 try catch 块:/
  • 好的,我建议你也抓住一个UnknownHostException,以防万一无法识别主机,记住要能够发送消息,你可以使用@987654325 @函数println(),所以你现在可以拥有:writer.println(message);,你可以使用readLine()从服务器读取它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多