2016-11-30 10 views
-1

私はあなたがサーバー間で通信できるようにする簡単なチャットプログラムを作成しています。別のファイルの1つのファイルで使用されているときにusername変数にアクセスする際に問題が発生しています。ユーザーは彼の名前を入力します。これはChatGUIファイルで行われ、チャットルームに入ると、EchoFrameファイルにEchoFrameが作成されます。また、EchoFrameファイルでは、ユーザメッセージにユーザ名を追加し、チャットルームに接続したときとチャットルームから退室したときに通知します。私は私の問題を説明する上で明確であることを望む、必要な他の情報は私に教えてください!小さなチャットプログラム、ファイル間のアクセス変数

EchoFrame

import java.awt.*; 
import java.awt.event.*; 
import java.io.*; 
import java.net.*; 

public class EchoFrame extends Frame{ 

    EchoPanel ep; 
    Button sendMessage; 

    public EchoFrame(){ 

     setSize(500,500); 
     setTitle("Echo Client"); 
     addWindowListener(new WindowAdapter(){ 
      public void windowClosing(WindowEvent we){ 
       System.exit(0); 
      } 
     }); 

     ep = new EchoPanel(); 
     add(ep, BorderLayout.CENTER); 




     setVisible(true); 
    } 

    public static void main(String[] args){ 

     EchoFrame ef = new EchoFrame(); 

    } 
} 


class EchoPanel extends Panel implements ActionListener, Runnable{ 

    TextField tf; 
    TextArea ta; 
    Button connect, disconnect; 
    Socket s; 
    BufferedReader br; 
    PrintWriter pw; 
    Thread t; 
    String fromServer; 
    String username; 


    public EchoPanel(){ 

     setLayout(new BorderLayout()); 
     tf = new TextField(); 
     tf.setEditable(false); 
     tf.addActionListener(this); 
     add(tf, BorderLayout.NORTH); 
     ta = new TextArea(); 
     ta.setEditable(false); 
     add(ta, BorderLayout.CENTER); 
     Panel buttonPanel = new Panel(); 
     connect = new Button("Connect"); 
     connect.addActionListener(this); 
     buttonPanel.add(connect); 
     disconnect = new Button("Disconnect"); 
     disconnect.setEnabled(false); 
     disconnect.addActionListener(this); 
     buttonPanel.add(disconnect); 
     add(buttonPanel, BorderLayout.SOUTH); 



    } 

    public void actionPerformed(ActionEvent ae){ 

     if(ae.getSource() == connect){ 
      try{ 
       s = new Socket("127.0.0.1", 8189); 
       ta.append(username + " has entered the chat room. \n"); 
       br = new BufferedReader(new InputStreamReader(s.getInputStream())); 
       pw = new PrintWriter(s.getOutputStream(), true); 
      }catch(UnknownHostException uhe){ 
       System.out.println(uhe.getMessage()); 
      }catch(IOException ioe){ 
       System.out.println(ioe.getMessage()); 
      } 

      t = new Thread(this); 
      t.start(); 
      tf.setEditable(true); 
      connect.setEnabled(false); 
      disconnect.setEnabled(true); 
     }else if(ae.getSource() == disconnect){ 
      try{ 
       pw.close(); 
       br.close(); 
       s.close(); 
      }catch(IOException ioe){ 
       System.out.println(ioe.getMessage()); 
      } 
      t = null; 
      ta.append(username + " has disconnected from chat room. \n"); 
      tf.setEditable(false); 
      connect.setEnabled(true); 
      disconnect.setEnabled(false); 
     }else if(ae.getSource() == tf){ 
      String fromTf = tf.getText(); 
      pw.println(fromTf); 
      tf.setText(""); 

     }else{ 

       //additional events 
     } 
    } 

    public void run(){ 
     fromServer = ""; 
     try{ 
      while((fromServer = br.readLine()) != null){ 

        ta.append(username + ":" + fromServer + "\n"); 
      } 
     }catch(IOException ioe){ 
      System.out.println(ioe.getMessage()); 
     } 
    } 

} 

ChatGUI

import java.awt.*; 
import java.awt.event.*; 
import java.io.*; 
import java.net.*; 
import java.awt.BorderLayout; 
import java.awt.CardLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 




public class ChatGUI extends JFrame { 

    private int currentCard = 1; 
    private JPanel cardPanel; 
    private CardLayout cl; 
    JTextField usernameField; 
    String username; 

    public ChatGUI() { 

     setTitle("Chat Program"); 
     setSize(500, 120); 
     cardPanel = new JPanel(); 

     cl = new CardLayout(); 
     cardPanel.setLayout(cl); 

     JPanel chooseUsername = new JPanel(); 
     JLabel usernameLabel = new JLabel("Please enter your username:"); 

     chooseUsername.add(usernameLabel); 
     cardPanel.add(chooseUsername, "Log in"); 

     usernameField = new JTextField(15); 


     usernameField.setEditable(true); 
     add(usernameField, BorderLayout.CENTER); 


     JPanel buttonPanel = new JPanel(); 
     JButton logInBtn = new JButton("Enter Chat Room"); 

     buttonPanel.add(logInBtn); 



     logInBtn.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent arg0) { 
       currentCard = 2; 
       cl.show(cardPanel, "" + (currentCard)); 

       username = usernameField.getText(); //gets username 
       EchoFrame ef = new EchoFrame(); //creates message room 

      } 
     }); 


     getContentPane().add(cardPanel, BorderLayout.NORTH); 
     getContentPane().add(buttonPanel, BorderLayout.SOUTH); 
    } 
    public static void main(String[] args) { 
     ChatGUI cl = new ChatGUI(); 
     cl.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     cl.setVisible(true); 
    } 
} 

チャットサーバー

import java.io.*; 
import java.net.*; 
import java.util.*; 

public class ChatServer{ 
    Socket s; 
    ArrayList <ChatHandler>handlers; 
    public ChatServer(){ 
     try{ 
      ServerSocket ss = new ServerSocket(8189); 
      handlers = new ArrayList<ChatHandler>(); 
      for(;;){ 
       s = ss.accept(); 
       new ChatHandler(s, handlers).start(); 
      } 
     }catch(IOException ioe){ 
      System.out.println(ioe.getMessage()); 
     } 
    } 
    public static void main(String[] args){ 
     ChatServer tes = new ChatServer(); 
    } 
} 

チャットハンドラ

import java.io.*; 
import java.net.*; 
import java.util.*; 

public class ChatHandler extends Thread{ 
    Socket s; 
    BufferedReader br; 
    PrintWriter pw; 
    String temp; 
    ArrayList <ChatHandler>handlers; 

    public ChatHandler(Socket s, ArrayList <ChatHandler>handlers){ 
     this.s = s; 
     this.handlers = handlers; 
    } 


    public void run(){ 
     try{ 
      handlers.add(this); 
      br = new BufferedReader(new InputStreamReader(s.getInputStream())); 
      pw = new PrintWriter(s.getOutputStream(), true); 
      temp = ""; 
      while((temp = br.readLine()) != null){ 
       for (ChatHandler ch : handlers){ 
        ch.pw.println(temp); 
       } 
       System.out.println(temp); 
      } 
     }catch(IOException ioe){ 
      System.out.println(ioe.getMessage());  
     }finally{ 
      handlers.remove(this); 
     } 
    } 
} 
+0

http://stackoverflow.com/help/mcve – nullpointer

答えて

0

私はあなたが各クライアントに送る必要があるすべての変数がサーバに入ることができるように、あなたがサーバプログラムとクライアントプログラムを持っているべきだと思います。

クライアントがサーバーaに接続すると、そのクライアント(username、ipadressなど)を接続されたクライアントのリストに追加し、そのクライアントにリッスン/送信する新しいスレッドを作成します。あなたはあなたが悪いと思う、あなたがsendToAll(idThreadSender、threadX.text)またはsendtothread(threadX、threadY.text)を使うことができるならば、あなたはすべてのユーザ(スレッド)にUsernameと彼が書いたものを送ることができます構造、それはすべてです。

私は助けてくれました。

+0

これは、私がそれを行う方法を知っていれば、意味があります:o – Gillky

1

userNameを静的にし、ChatUI.userNameでアクセスしてください。実際には、userNameChatUIであってはなりません。あるいは、MySQLを入手し、データベースを設定し、複数のユーザを持つ場合は、JDBCで接続する方がより重い選択肢となります。

Simple Client And Server Chat ProgramCreating a simple Chat Client/Server Solutionのような例も試してみてください。それらは、マルチスレッドなどの主要トピックをカバーしています。

+0

これは実際には、ありがとうございました! – Gillky

+0

私は問題に遭遇しましたが、うまくいきましたが、チャットGUIでは2人のGUISが開いているときにそれぞれの名前が表示されません。例えば、ロスとボブがチャットしていたら、ロスだけが彼の画面上で話しているように見えるでしょう。 – Gillky

+0

[単純なクライアントとサーバーチャットプログラム](http://www.dreamincode.net/forums/topic/262304-simple-client-and-server-chat-program /)と[簡単なチャットクライアント/サーバーソリューションの作成](http://pirate.shu.edu/~wachsmut/Teaching/CSAS2214/Virtual /Lectures/chat-c​​lient-server.html)。 –

関連する問題