codingeverybody / codingyahac

https://coding.yah.ac
292 stars 50 forks source link

java class간의 변수나 메소드 가져오기 #739

Open CEmmanuelP opened 4 years ago

CEmmanuelP commented 4 years ago

해결하고자 하는 문제

MultiServer에 있는 ArrayList list의 크기를 Home화면으로 불러오고 싶습니다. 밑에 있는 MultiServerThread에서는 ms.getList().size()로 불러올 수 있는데 Home.java에서 똑같이 MultiServer 객체를 생성하고 ms.getList().size()로 불려오려고 하면 실행이 안됩니다..

코드 혹은 오류

   public class MultiServer {
    private ArrayList<MultiServerThread> list;
    private Socket socket;
    private Socket socket2;
    public MultiServer() throws IOException {

        list = new ArrayList<MultiServerThread>();
        ServerSocket serverSocket = new ServerSocket(1771);
        ServerSocket serverSocket2 = new ServerSocket(1773);
        MultiServerThread mst = null;

        boolean isStop = false;
        while (!isStop) {//true
            System.out.println("Server ready...");
            socket = serverSocket.accept();
            socket2 = serverSocket2.accept();
            System.out.println("start");
            mst = new MultiServerThread(this);
            list.add(mst);
            Thread t = new Thread(mst);
            t.start();
        }
    }

    public ArrayList<MultiServerThread> getList() {
        return list;
    }

public class Home extends JFrame implements ActionListener{

    String ip;
    String id;
    Font font;
    Color color;
    MultiServer ms;

    private JLabel jl1, jl2, jl3, jl4;
    ImageIcon img;

    private JButton jbLogout;
    private JButton jb2;
    private JButton jb3;

    private JPanel jp1 = new JPanel();

    public Home(String ip,String id,Font font,Color color) {
        this.ip = ip;
        this.id = id;
        this.font = font;
        this.color = color;

        try{
              ms = new MultiServer()
            }catch(IOException e){
               e.printStackTrace();}

        draw();

        jl1 = new JLabel("Multi Chat");
        jl2 = new JLabel(id + " 님 로그인하셨습니다.");
        jl3 = new JLabel("현재 접속중인 인원은 " + list.getSize() + " 명 입니다.");

환경

사용중인 운영체제, 언어, 라이브러리의 버전을 적어주세요.

github

https://github.com/CEmmanuelP/chatting.git

Haytsir commented 4 years ago

HomeMultiServer클라이언트서버간의 관계라면, 통신을 통해 MultiServerThread에서 Home이 접속했을 때 ms.getList().size() 값을 전송해주고, Home에서 받도록 하는 방법이 맞는 것 같네요.

Home에서 새로운 객체를 생성한다고 해도 getList().size()값이 원하는 값이 나오진 않을거에요. 아예 새로운 서버를 하나 만드는 행위이니까요.

CEmmanuelP commented 4 years ago

HomeMultiServer클라이언트서버간의 관계라면, 통신을 통해 MultiServerThread에서 Home이 접속했을 때 ms.getList().size() 값을 전송해주고, Home에서 받도록 하는 방법이 맞는 것 같네요.

MultiServer와 Chat이 서버와 클라이언트의 관계이고 Login은 처음에 폰트같은걸 설정해주는 창이고 Home은 닉네임과 현재 접속자수를 보여주고 버튼에 따라 Chat창과 Memo창으로 접속하는 기능입니다. login과 home은 MultiServer와 따로 연결되어있지 않습니다(클라이언트가 아닌 것 같습니다.). 그러면 Home에 socket을 연결해서 ms.getList().size()값을 전송해 주면 되는 건가요? 조금만 더 자세히 설명해주시면 이해할 수 있을 것 같습니다. ㅠㅠ

Haytsir commented 4 years ago

먼저 Home이 서버단에서 동작하는 클래스인지, 클라이언트단에서 동작하는 클래스인지 구분할 필요가 있습니다.

제가 보기엔 클라이언트 측 같은데, 그렇다고 하면 socket을 연결해서 서버에서 사이즈를 전송해주는 게 맞겠어요.