Тестирование Swing Socket - PullRequest
       10

Тестирование Swing Socket

0 голосов
/ 09 марта 2010

Я пробую программу с Swing.
Я использую сокет для подключения к серверу, и у клиента есть код GUI.


public class FactClient extends JFrame implements ActionListener
{
    Socket s;
    InputStream in;
    OutputStream os;
    Scanner sin;
    PrintWriter out;
    JPanel jp;
    JTextField jt;
    JButton jb;
    JLabel jl;
    FactClient()
    {
        jp = new JPanel();

        jt = new JTextField("Enter number",15);
        jb = new JButton("Compute Factorial");
        jl = new JLabel("Answer");

        jb.addActionListener(this);
        jp.add(jt);
        jp.add(jb);
        jp.add(jl);

        add(jp);
        setVisible(true);
        setSize(200,100);
        try
        {
            s = new Socket("localhost",8189);
            try
            {
                in = s.getInputStream();
                os = s.getOutputStream();

                sin = new Scanner(in);
                out = new PrintWriter(os);
                out.println("Done with the bingo");
            }
            finally {}
        }
        catch(Exception e)
        {
            System.out.println("Error in client code " + e );
        }    
    }
    public void actionPerformed(ActionEvent ae)
    {
        try {
                System.out.println("Connection established " + jt.getText());
                String t = jt.getText();
                out.println("Ashish");
                System.out.println("Data Send");
                t = sin.nextLine();
                jl.setText(t);
        }
        catch(Exception e)
        {
            System.out.println("Error in client code " + e );
        }

    }
    public static void main(String args[])
    {
        new FactClient();
    }
}
<Ч />

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

public class FactServer
{
    public static void main(String args[])
    {

        ServerSocket s;
        Socket socket;
        try
        {
            s= new ServerSocket(8189);
            socket = s.accept();
            try
            {
                InputStream in = socket.getInputStream();
                OutputStream os = socket.getOutputStream();

//              Scanner sin = new Scanner(in);
                BufferedReader br = new BufferedReader(new InputStreamReader(in));
                PrintWriter ou = new PrintWriter(os);
                System.out.println("Connection Established : Stream initailzed");
                try
                {
                    String data = br.readLine();
                    System.out.println("Data Recvd." + data);
                    data = br.readLine();
                }
                catch(Exception e)
                {
                    System.out.println("EEEEEEEEEEEEE" + e);
                }
                //int fact = data +20;
                ou.println("40");
            }
            catch (Exception e)
            {
                System.out.println("ERROR :P");
            }
            finally
            {
                socket.close();
            }
        }
        catch(Exception e)
        {
            System.out.println("ERROR" + e);
        }
    }
}

Серверный код просто считывает данные, которые я отправляю, используя System.out.println. Но проблема в том, что он зависает; сервер никогда не получает данные!

       out.println("Done with the bingo");

Это первая строка, которую должен получить сервер. Но он остается в состоянии ожидания, как будто ничего не получено.

Ответы [ 2 ]

3 голосов
/ 09 марта 2010

Вы должны использовать flush() после каждого println() или активировать автоматическую очистку PrintWriter, чтобы данные действительно отправлялись:

...
out = new PrintWriter(os);
out.println("Done with the bingo");
out.flush();
...

или

...
out = new PrintWriter(os, true);    // autoflush
out.println("Done with the bingo");
...

не забудьте сервер ...

2 голосов
/ 09 марта 2010

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

Оберните логику сервера в цикл (например, while(true) {...}), если вы хотите, чтобы он обрабатывал несколько клиентских запросов и обрабатывал каждый запрос в отдельном потоке.

Поскольку вы делаете запрос клиента в потоке диспетчеризации событий Swing (то есть в методе actionPerformed ()), вы можете рассмотреть его оборачивание в Runnable или SwingWorker, чтобы не блокировать поток диспетчеризации. В противном случае вы можете заметить, что пользовательский интерфейс зависает или не рисует во время обмена данными с сокетом.

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