ObjectOutputStream нужен ответ от сервера? - PullRequest
0 голосов
/ 24 февраля 2012
Socket Client = new Socket("ip", port);
private ObjectOutputStream out;
out = new ObjectOutputStream(Client.getOutputStream());//line3
out.flush();

У меня есть программа-сокет. Когда у меня есть клиент, проблем нет. Но когда клиент больше, чем один в секунду и более поздний клиент, в строке 3. программа имеет значение waiting. В ней нет ошибок и исключений. проблема?

        TCP = new Thread(new Runnable() {

            @Override
            public void run() {
           if ("TCP".equals(Protocol)) {
            try {
                Thread.sleep(10);
            } catch (InterruptedException ex) {
                Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
            }

            RunServer();

        }   
            }
        });
        TCPWait = new Thread(new Runnable() {

            @Override
            public void run() {
                try {
                    WaitForConnection();
                } catch (IOException ex) {
                    Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        });
        TCPWait.start();
        TCP.start();
    public void RunServer() {
        try {

            while (true) {
                {
                    accessLock.lock();
                    if(CanContinue == false)
                        condition.await();
                    try {
//                        WaitForConnection();
                        GetStreams();
                        ProcessConnection();
                    accessLock.unlock();

                    } catch (Exception e) {
                        JOptionPane.showMessageDialog(rootPane, "ارتباط قطع شد" + e.getMessage());


                    }
                }
            }

        } catch (Exception e) {
            JOptionPane.showMessageDialog(rootPane, e.getMessage());
        }
    public void WaitForConnection() throws IOException {
        jTextArea1.append("لطفا تا برقرای ارتباط صبر کنید.../n ");
        accessLock.lock();
        connection = server.accept();
       CanContinue = true;
       condition.signal();
       accessLock.unlock();

        jTextArea1.append("ارتباط از " + connection.getInetAddress().getHostName() + "\n");

    }

    public void GetStreams() {
        try {
            Socket s = new Socket();
            s = connection;
            out = new ObjectOutputStream(s.getOutputStream());
            out.flush();

            in = new ObjectInputStream(s.getInputStream());
            jTextArea1.append("در حال برقرای ارتباط...\n");
        } catch (Exception e) {
            JOptionPane.showMessageDialog(rootPane, "مشکل در برقرای ارتباط!\n");

        }

    }

    public void ProcessConnection() {
        SendData("ارتباط برقرا شد\n");
        try {
            jTextArea1.append((String) in.readObject() + "\n");

        } catch (Exception e) {
        }
        String message = "";

        do {
            try {

                jTextArea1.append((String) in.readObject() + "\n");
            } catch (Exception e) {
            }
        } while (message != "Exit");


    }

WaitForConnection() - это прослушиватель в потоке, а runserver() отправка и получение сообщений в другом потоке.

Ответы [ 2 ]

1 голос
/ 24 февраля 2012
Socket s = new Socket();
s = connection;

Что-то там серьезно не так.

0 голосов
/ 24 февраля 2012

Насколько я вижу, вы ожидаете соединения только один раз в этой теме:

    TCPWait = new Thread(new Runnable() {

        @Override
        public void run() {
            try {
                WaitForConnection();
            } catch (IOException ex) {
                Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    });

вместо ожидания нескольких соединений в основном цикле:

        while (true) {
            {
                accessLock.lock();
                if(CanContinue == false)
                    condition.await();
                try {
        //            WaitForConnection();
                    GetStreams();
                    ProcessConnection();
                accessLock.unlock();

                } catch (Exception e) {
                    JOptionPane.showMessageDialog(rootPane, "ارتباط قطع شد" + e.getMessage());


                }
            }
        }

Итак, один клиент подключается, а остальные застревают, потому что вы никогда больше не звоните, примите снова. Вам следует раскомментировать этот звонок на WaitForConnection();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...