因此,我有一个称为ChatClient的类,并与ChatServer类一起用作多聊天加密信使。所以我有一些像下面这样的Swing组件,并在我的ChatClient构造函数中将它们初始化: 公共静态ChatClient客户端;
// GUI ELEMENTS
BufferedReader in;
PrintWriter out;
JFrame frame;
public static JTextArea userText;
JTextArea DisplayMessage;
JLabel connectInfo;
JToggleButton tglbtnConnect;
JToggleButton tglbtnDisconnect;
JLayeredPane layeredPane;
JLayeredPane layeredPane_1;
JRadioButton rdbtnAes;
JRadioButton rdbtnDes;
JRadioButton rdbtnCbs;
JRadioButton rdbtnOfb;
JPanel panel;
JLabel lblServer;
JLabel lblText;
JLabel lblCryptText;
JTextArea encryptedText;
JToggleButton tglbtnNewToggleButton;
JToggleButton tglbtnNewToggleButton_1;
然后我有提供消息的 run()方法。我的问题是,当我使用如下所示的主要方法时,以便在框架打开时在连接按钮中运行 run()方法(最初它会询问用户名),并且希望连接后运行该方法按钮:
public static void main(String[] args) throws Exception {
client = new ChatClient();
client.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
client.frame.setVisible(true);
}
tglbtnConnect =新的JToggleButton(“ Connect”); tglbtnConnect.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent arg0) {
try {
client.run();
connectInfo.setText("Connected");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
tglbtnConnect.setBounds(12, 36, 106, 25);
问题是当我单击connect时,它询问用户名,然后离开gui,这样ı不能使用任何组件。任何帮助或提示表示赞赏。您可以在下面找到我的整个班级:https://pastebin.com/N7Ncz7yk
您可以在下面找到我的运行方法:
private void run() throws Exception {
// Make connection and initialize streams
String serverAddress = "localhost";
Socket socket = new Socket(serverAddress, 9001);
in = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
out = new PrintWriter(socket.getOutputStream(), true);
// Process all messages from server, according to the protocol.
while (true) {
String line = in.readLine();
if (line.startsWith("SUBMITNAME")) {
out.println(getName());
} else if (line.startsWith("NAMEACCEPTED")) {
userText.setEditable(true);
} else if (line.startsWith("MESSAGE")) {
int idx = line.lastIndexOf(">");
String mssg = line.substring(idx + 1);
if(rdbtnAes.isSelected() && rdbtnCbs.isSelected()){
String key="MZygpewJsCpRrfOr";
byte[] encryptionKey = "MZygpewJsCpRrfOr".getBytes();
//byte[] plainText = input.getBytes();
AES advancedEncryptionStandard = new AES(encryptionKey);
byte[] cipherText = advancedEncryptionStandard.encrypt(mssg,key,0);
String decryptedCipherText = advancedEncryptionStandard.decrypt(cipherText,key,0);
String encrytepdText=new String(cipherText);
// APPEND MESSAGE
DisplayMessage.append(encrytepdText + "\n" + line.substring(8,idx + 1) + decryptedCipherText + "\n");
}
else if(rdbtnAes.isSelected() && rdbtnOfb.isSelected()){
String key="MZygpewJsCpRrfOr";
byte[] encryptionKey = "MZygpewJsCpRrfOr".getBytes();
//byte[] plainText = input.getBytes();
AES advancedEncryptionStandard = new AES(encryptionKey);
byte[] cipherText = advancedEncryptionStandard.encrypt(mssg,key,1);
String decryptedCipherText = advancedEncryptionStandard.decrypt(cipherText,key,1);
String encrytepdText=new String(cipherText);
// APPEND MESSAGE
DisplayMessage.append(encrytepdText + "\n" + line.substring(8,idx + 1) + decryptedCipherText + "\n");
}
else if(rdbtnDes.isSelected()&& rdbtnCbs.isSelected()){
DES desEncryption=new DES(mssg,0);
DisplayMessage.append(desEncryption.encryptedData + "\n" + line.substring(8,idx + 1) + desEncryption.decryptedMessage + "\n");
}
else if(rdbtnDes.isSelected() && rdbtnOfb.isSelected()){
DES desEncryption=new DES(mssg,1);
DisplayMessage.append(desEncryption.encryptedData + "\n" + line.substring(8,idx + 1) + desEncryption.decryptedMessage + "\n");
}
}
}
}
答案 0 :(得分:0)
在您的<amp-audio
width="auto"
height="50">
<source type="audio/mpeg" src="https://....mp3"
[src]="audiosrc">
</amp-audio>
<amp-list
items="Items"
height="315px"
layout="fixed-height"
src="JSONFILE"
id="podcastlist">
<template type="amp-mustache">
<div class="box" on="tap:AMP.setState({ audiosrc : '{{mp3}}' })">
{{name}}
</div>
</template>
</amp-list>
方法中,您可以通过编写client.run()
而不创建while (true)
或break
来创建无限循环。因为此方法是从return
的UI线程中调用的,所以您的UI卡住了/没有响应“不可用”。
解决方案:创建一个新的ActionListener
,该服务器运行服务器侦听代码并从该线程更新UI。 Connect应该仅以Thread
开始该线程,然后返回。