我必須使用套接字連接兩個 java 應用程式。客戶端是一個 java 表單,我在其中插入用戶名和密碼,而服務器是“身份驗證器”。
客戶端應用程式 GUI
我的問題是:我應該每次都創建一個客戶端連接,還是必須繼續使用相同的連接,直到應用程式關閉?因為在這種情況下,如何僅在單擊按鈕時發送資料?
ClientSocket 類
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 類
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);
}
}
uj5u.com熱心網友回復:
首先,我希望這只是一個學習示例。否則請避免通過普通連接發送密碼,因為這是非常糟糕的做法!
至于你真正的問題:正如 user253751 已經提到的,這取決于你。
但是您應該考慮客戶端和服務器之間使用的協議。根據您的代碼,您在第一行發送用戶名,在第二行發送密碼。但我認為您不僅會登錄服務器,還會執行一些操作/處理一些資料。想想你將如何識別訊息是登錄、資料請求還是處理命令。我建議你閱讀一些常用的協議,如 http、smtp 等,以學習并從中獲得靈感。
另請注意,當您收到資料時,它并不總是完整的訊息。它可以是訊息的第一部分,然后在同一緩沖區中是訊息的第二(和最后)部分以及下一條訊息的開頭。
當您嘗試決定是否保持連接打開時,您應該記住的另一件事是,您必須在服務器中保持客戶端的狀態,并確保只有登錄的用戶才能啟動操作。打開連接可能是一種簡單的方法,但它也可以通過每個操作必須提供的會話識別符號來解決(并且在網路上也不應該是可讀的)。
希望這有助于采取下一步行動。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/462585.html
上一篇:OPCUA與套接字編程
