如何在此客户端和服务器之间创建套接字连接

How to create a socket connection between this client and server

我必须使用套接字连接两个 java 应用程序。客户端是一个 java 表单,我在其中插入用户名和密码,而服务器是“身份验证器”。

Client App GUI

我的问题是:我应该每次都创建一个客户端连接,还是我必须继续使用同一个连接直到应用程序关闭?因为在这种情况下,如何只在单击按钮时发送数据?

ClientSocket class

public class ClientSocket {

public void start(String txtUser, String txtPsw) {

    String hostname = "127.0.0.1";
    int port = 42768;

    try (Socket socket = new Socket(hostname, port)) {

        System.out.println("Socket started");

        OutputStream output = socket.getOutputStream();
        PrintWriter writer = new PrintWriter(output, true);

        writer.println(txtUser);
        writer.println(txtPsw);

    } catch (UnknownHostException ex) {

        System.out.println("Server not found: " + ex.getMessage());

    } catch (IOException ex) {

        System.out.println("I/O error: " + ex.getMessage());
    }
}
}

FormGUI class

public class FormGUI {
private JPanel panel1;
private JTextField txtUser;
private JPasswordField txtPsw;
private JButton button1;


public FormGUI() {

    button1.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            System.out.println(txtUser.getText());
            System.out.println(txtPsw.getPassword());
            new ClientSocket().start(txtUser.getText(), String.valueOf(txtPsw.getPassword()));
        }
    });
}

public static void main(String[] args) {
    JFrame frame = new JFrame("FormGUI");
    frame.setContentPane(new FormGUI().panel1);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.pack();
    frame.setVisible(true);

}

}

首先我希望这只是一个学习示例。否则请避免通过普通连接发送密码,因为这是非常糟糕的做法!

至于你真正的问题:正如user253751已经提到的,这取决于你。

但是您应该考虑在客户端和服务器之间使用的协议。根据您的代码,您在第一行发送用户名,在第二行发送密码。但是我想你不会只是登录服务器还会做一些actions/process一些数据。考虑一下您将如何识别消息是登录、数据请求还是处理命令。我建议您阅读一些常用的协议,如 http、smtp 等,以学习并从中获得灵感。

另请注意,当您收到数据时,它并不总是完整的消息。它可以是消息的第一部分,然后在同一缓冲区中是消息的第二(也是最后)部分和下一条消息的开头。

当您尝试决定是否保持连接打开时,您应该记住的另一件事是,您必须在服务器中保持客户端的状态,并确保只有登录的用户才能启动动作。打开连接可能是一种简单的方法,但也可以通过每个操作都必须提供的会话标识符来解决(并且在网络上也不应该是可读的)。

希望这有助于采取后续步骤。