2017-09-24 2 views
-1

今私はチャットプログラムを作っています。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。

+0

最初の質問では、優先度は何ですか?私は 'login_Frame'ではログインボタンをクリックすると思います。 id/pwはサーバーを送信します。サーバー送信プロトコル。ブール値が変更されます。'login_Frame 'ログインボタンのアクションの' if(test){'は実行されますか? – hohodduck

答えて

0

okなどのデバッグメッセージが表示されますか?

私はここにいくつかのものを見ることができます:

public void sendMessage(String msg2) { 
    try { 
     out.writeUTF(msg2); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

それはあなたのデータが送信やったことがなかったということであるかもしれないので、あなたは、ストリームをフラッシュすることはありません。これで、ログインチェックの結果を受け取ることはありません。

while(in.available()>0) 
{ 
    packet = in.readUTF(); 
    System.out.println(packet+"%%%"); 
} 

これは、データを解析する実際のループの前のwhileループです。このループ中に応答が送信された場合は、それ以降の読み取りで失われます。また、in.availableを使用すると、データを読み込むのに適していません。 availableは、ブロッキングなしでストリームから読み取ることができるバイト数だけを返します。ネットワーク接続が遅い場合、読み取るべきバイトがまだあっても、0を返します。

while (in != null) { 
    packet = in.readUTF(); 
    StringTokenizer st = new StringTokenizer(packet,"/"); 
    [...] 

データが実際に解析される場合は、前のwhileループの結果である、あなたはin.readUTF

while (true) { 
    Receiver receiver = new Receiver(mid_server); 
    receiver.start(); 
} 

の繰り返し呼び出しで何か他のもので、それを置き換えるこれは、スレッドの数千人と数千人を作成し、許可されたスレッドの上限に達するとOutOfMemoryErrorでこのアプリケーションを終了させる可能性が非常に高くなります。

+0

こんにちは!あなたは私の質問を覚えていますか?たぶん...それは解決されていません...私は私のoutputstreamをフラッシュしましたが、ログインプロセスはまだ動作しません... – hohodduck

+0

@hohodduck私の答えは、outputstreamをフラッシュするための示唆だけではありません。他の問題も解決しましたか?それでも助けが必要な場合は、あなたの質問を編集して、現在の状況、つまりあなたの現在のコードの様子と、提案された変更を行った後の新しいsympsomsについて説明してください。 – Lothar

+0

私は私の質問を編集! – hohodduck

関連する問題