таймер Java и проблема сокета - PullRequest
2 голосов
/ 20 апреля 2010

Я пытаюсь создать программу, которая прослушивает входной поток клиента, используя сокет программирования и таймер

но всякий раз, когда запускается таймер .. это повешено

Пожалуйста, помогите мне

вот код ...

private void jButton1MouseClicked(java.awt.event.MouseEvent evt) {
    // TODO add your handling code here:
    try

    {
        ServerUserName=jTextField1.getText();
        ss=new ServerSocket(5000);
        jButton1.enable(false);
        jTextArea1.enable(true);
        jTextField2.enable(true);
        Timer t=new Timer(2000, new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                try
                {
                    s=ss.accept();                    
                    InputStream is=s.getInputStream();
                    DataInputStream dis=new DataInputStream(is);
                    jTextArea1.append(dis.readUTF());

                }
                catch(IOException IOE)
                {
                }
                catch(Exception ex)
                {
                    setLbl(ex.getMessage());
                }

            }
        });
        t.start();
    }
    catch(IOException IOE)
    {

    }
}

Заранее спасибо

Ответы [ 3 ]

4 голосов
/ 20 апреля 2010

Сделать программу многопоточной; один поток слушает сокет, другой обрабатывает GUI. Используйте SwingUtilities.invokeLater, чтобы позволить потоку GUI («поток диспетчеризации событий») обновлять графический интерфейс всякий раз, когда сетевой поток получает данные.

1 голос
/ 20 апреля 2010

Каждый вызов accept ожидает подключения нового клиента к серверу. Вызов блокируется, пока не будет установлено соединение. Похоже, у вас есть один клиент, который поддерживает соединение с сервером.

Одно из решений - потянуть

s=ss.accept();                    
InputStream is=s.getInputStream();
DataInputStream dis=new DataInputStream(is);

вне таймерной части кода.

Обновление: знайте, что readUTF все еще будет блокироваться, если нет доступных данных для чтения.

0 голосов
/ 20 апреля 2010

Я думаю, что вы хотите использовать время ожидания сокета вместо таймера:

Thread listener = new Thread() {
    ServerSocket ss;

    @Override
    public void run() {
        try {
            ss = new ServerSocket(5000);
            ss.setSoTimeout(2000);
            try {
                while (true) {
                    try {
                        final String text = acceptText();
                        SwingUtilities.invokeLater(new Runnable() {
                            public void run() {
                                jTextArea1.append(text);
                            }
                        });
                    } catch (final Exception ex) {
                        SwingUtilities.invokeLater(new Runnable() {
                            public void run() {
                                setLbl(ex.getMessage());
                            }
                        });
                    }
                }
            } finally {
                ss.close();
            }
        } catch (IOException ex) {
            Logger.getLogger(NewClass.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    private String acceptText() throws IOException {
        Socket s = ss.accept();
        try {
            InputStream is=s.getInputStream();
            try {
                DataInputStream dis=new DataInputStream(is);
                return dis.readUTF();
            } finally {
                is.close();
            }
        } finally {
            s.close();
        }
    }
};
listener.setDaemon(true);
listener.start();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...