0

我正在使用 swing jFrame 为我的客户端-服务器预订系统创建一个 GUI。我在客户端上遇到了我想使用在此声明的 DatagramSocket 的问题:

public BookingClientUI() throws SocketException {
        DatagramSocket clientSocket = new DatagramSocket(9876);
        initComponents();
        RecvPacket recvProcess = new RecvPacket(clientSocket);
        Thread recvThread = new Thread(recvProcess);
        recvThread.start();
}

稍后在此按钮 ActionPerformed 中:

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    try {
        String passwordString = new String(passwordfield.getPassword());
        byte[] passwordBytes = passwordString.getBytes();
        byte[] packetData = new byte[1500];
        packetData = SendPacketHandler.packetConstructor(SendOpcodes.REGISTER_USER,usernamefield.getText(),EncryptionHandler.hashPassword(passwordBytes));
        DatagramPacket packet = new DatagramPacket(packetData,packetData.length,InetAddress.getByName("127.0.0.1"),9876);
        clientSocket.send(packet);
    } catch (NoSuchAlgorithmException | UnknownHostException | IOException ex) {
        Logger.getLogger(BookingClientUI.class.getName()).log(Level.SEVERE, null, ex);
    }

}    

显然,这条线:

        clientSocket.send(packet);

由于声明的 DatagramSocket 不在范围内,因此出现“找不到符号”错误。但是我不知道如何解决这个问题,因为我只用 Java 编程了几天。

任何帮助,将不胜感激。

4

1 回答 1

1

您只需要将套接字存储到稍后可供按钮处理程序访问的类的数据成员中。您没有对您的类层次结构进行足够的解释来说明如何做到这一点。如果按钮处理程序在里面BookingClientUI,那很简单。你会有类似的东西:

public BookingClientUI() extends JFrame {

  final DatagramSocket clientSocket;

  public BookingClientUI() throws SocketException {
    // Initialize the data member with the open socket.
    clientSocket = new DatagramSocket(9876);
    initComponents();
    RecvPacket recvProcess = new RecvPacket(clientSocket);
    Thread recvThread = new Thread(recvProcess);
    recvThread.start();
  }

  // Any member function can now use clientSocket, including a button action.

}

在这一切中,不要忘记(几乎)所有 Swing 代码都必须在 UI 线程中运行。

于 2013-03-30T17:44:54.980 回答