今私はチャットプログラムを作っています。Javaソケット(別のクラスのブール値を変更)とデータストリーム
しかし、いくつかの問題があります。
最初に、ログインプロセスで、id/pwをサーバに送信すると、サーバはそれが正しいか間違っているか(プロトコル3000または3001)送信します。クライアントはプロトコルを取得します。
islogin(boolean)
が変更されます。ただし、ブール値は変更されません。私はなぜそれが変更されていないのか分からない。いくつかのコードがあります。
clientbackground.java
package client;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.StringTokenizer;
import crypto.des;
public class ClientBackground implements Runnable{
Socket socket;
DataInputStream in;
private DataOutputStream out;
private ClientGui gui;
private String msg;
String id;
private String pass;
private boolean islogin;
private login_Frame lf;
private regform rf;
private String info;
Thread clientThread;
des crypto;
String packet="";
String tmp;
boolean test = false;
int protocol;
public final void setGui(ClientGui gui) {
this.gui = gui;
}
public void run() {
try {
socket = new Socket("192.168.0.11", 7770);
System.out.println("connect!.");
socket.setTcpNoDelay(true);
crypto = new des();
//crypto.SetD();
out = new DataOutputStream(socket.getOutputStream());
in = new DataInputStream(socket.getInputStream());
System.out.println(in.available()); //test
System.out.println("okay!");
while (in != null) {
packet = in.readUTF();
StringTokenizer st = new StringTokenizer(packet,"/");
tmp = st.nextToken();
msg = st.nextToken();
this.protocol = Integer.parseInt(tmp);
System.out.println(this.protocol+"&&&&"); //test
switch(this.protocol){
case 3000 :{
System.out.println("success");
test = true;
this.lf.gettest(test);
}
break;
case 3001 :{
System.out.println("wrong");
test = false;
this.lf.gettest(test);
}
break;
default :{
gui.jta.append(msg);
System.out.println(msg);
System.out.println(test+"%%");
}
break;
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
/*public void loginP() {
System.out.println(this.protocol+"&&&&");
switch(this.protocol){
case 3000 :{
System.out.println("success");
test = true;
this.lf.gettest(test);
}
break;
case 3001 :{
System.out.println("wrong!");
test = false;
this.lf.gettest(test);
}
break;
}
}*/
public static void main(String[] args){
ClientBackground clientBackground = new ClientBackground();
Thread clientThread = new Thread(clientBackground);
clientThread.setPriority(1);
clientThread.start();
clientBackground.lf = new login_Frame();
clientBackground.lf.Clientback(clientBackground);
}
public void showFrameTest() {
this.lf.setVisible(false);
this.gui = new ClientGui();
this.gui.Clientback(this);
}
public void showregfrom() {
this.lf.setVisible(false);
this.rf = new regform();
this.rf.Clientbackreg(this);
}
public void relogin_form() {
this.rf.dispose();
this.lf.setVisible(true);
}
public void sendMessage(String msg2) {
try {
out.writeUTF(msg2);
out.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
public boolean lcheck() {
return islogin;
}
public void setid(String id, String pass) {
this.id = id;
this.pass = pass;
}
public String getid() {
return id;
}
}
login_Frame.java
package client;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.DataInputStream;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;
import javax.crypto.NoSuchPaddingException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import crypto.des;
public class login_Frame extends JFrame{
private static final long serialVersionUID = 1L;
private String id;
private String pass;
JButton logb = new JButton("login");
JButton exitb = new JButton("cancel");
JButton regb = new JButton("reg");
JLabel idlb = new JLabel("ID : ");
JLabel pwlb = new JLabel("PW : ");
JTextField idtb = new JTextField();
JTextField pwtb = new JTextField();
private static ClientBackground client;
private DataInputStream in;
byte[] CpStr = null;
boolean test = false;
String packet,tmp;
public login_Frame(){
new Thread(client).start();
getContentPane().add(logb);
getContentPane().add(exitb);
getContentPane().add(regb);
getContentPane().add(idlb);
getContentPane().add(pwlb);
getContentPane().add(idtb);
getContentPane().add(pwtb);
setLayout(null);
setBounds(100, 100, 400, 200);
setVisible(true);
logb.setBounds(40, 110, 90, 40);
exitb.setBounds(150, 110, 90, 40);
regb.setBounds(260, 110, 90, 40);
idlb.setBounds(20, 10, 50, 40);
pwlb.setBounds(20, 60, 50, 40);
idtb.setBounds(70, 10, 280, 40);
pwtb.setBounds(70, 60, 280, 40);
ActionListener confirmListener = new ConfirmListener();
ActionListener exListener = new ExitListener();
ActionListener regListener = new RegListener();
logb.addActionListener(confirmListener);
exitb.addActionListener(exListener);
regb.addActionListener(regListener);
idtb.addActionListener(confirmListener);
pwtb.addActionListener(confirmListener);
}
public String getidtb(){
return idtb.getText();
}
public String getpwtb(){
return pwtb.getText();
}
private class ConfirmListener implements ActionListener {
public void actionPerformed(ActionEvent e){
try {
isLoginCheck();
System.out.println(test); //test
if(client.test){
System.out.println(client.test+"%%%%"); //test
client.showFrameTest();
}
else{
JOptionPane.showMessageDialog(null, "wrong!");
}
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
private class RegListener implements ActionListener {
public void actionPerformed(ActionEvent e){
regbtaction();
}
}
private class ExitListener implements ActionListener {
public void actionPerformed(ActionEvent e){
System.exit(0);
}
}
public void Clientback(ClientBackground client) {
this.client = client;
}
public void isLoginCheck() throws Exception{
id = getidtb();
pass = getpwtb();
new Thread(client).start();
//CpStr = client.crypto.Encrypts(pass);
idtb.setText("");
pwtb.setText("");
client.setid(id, pass);
client.sendMessage("3004"+"/"+id+"/"+pass);
}
public void regbtaction() {
client.showregfrom();
this.setVisible(false);
}
public void gettest(boolean test) {
this.test = test;
}
}
私はいくつかのコードを編集して、ログイン処理を検証するために、いくつかのテストコードを追加します。 プログラムを実行してログインボタンをクリックすると、間違ったメッセージが表示されます。しかし、いくつかのテストコードは何かを教えてくれます。接続!
0
okay!
connect!.
0
okay!
false
3000&&&&
success
これは、clientBackgroundの推奨です。特に、3000&&&&
とsuccess
これは、clientBackgroundが正しいプロトコルを受け取ったことを意味します。次に、テストブール値(true)を編集します。しかしここにいくつかの問題があります。私はログインボタンをクリックするとisLoginCheck
が実行され、次にテストブール値が変更されなければなりません。ただし、if(client.test){
が先に実行されます。変更の処理順序が必要です。注文を変更する方法..?
@Lothar plzヘルプme。
最初の質問では、優先度は何ですか?私は 'login_Frame'ではログインボタンをクリックすると思います。 id/pwはサーバーを送信します。サーバー送信プロトコル。ブール値が変更されます。'login_Frame 'ログインボタンのアクションの' if(test){'は実行されますか? – hohodduck