如何在此客户端和服务器之间创建套接字连接
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 等,以学习并从中获得灵感。
另请注意,当您收到数据时,它并不总是完整的消息。它可以是消息的第一部分,然后在同一缓冲区中是消息的第二(也是最后)部分和下一条消息的开头。
当您尝试决定是否保持连接打开时,您应该记住的另一件事是,您必须在服务器中保持客户端的状态,并确保只有登录的用户才能启动动作。打开连接可能是一种简单的方法,但也可以通过每个操作都必须提供的会话标识符来解决(并且在网络上也不应该是可读的)。
希望这有助于采取后续步骤。
我必须使用套接字连接两个 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 等,以学习并从中获得灵感。
另请注意,当您收到数据时,它并不总是完整的消息。它可以是消息的第一部分,然后在同一缓冲区中是消息的第二(也是最后)部分和下一条消息的开头。
当您尝试决定是否保持连接打开时,您应该记住的另一件事是,您必须在服务器中保持客户端的状态,并确保只有登录的用户才能启动动作。打开连接可能是一种简单的方法,但也可以通过每个操作都必须提供的会话标识符来解决(并且在网络上也不应该是可读的)。
希望这有助于采取后续步骤。