Сокет не может получить данные - PullRequest
0 голосов
/ 09 января 2012

У меня есть класс, реализующий класс serversocket, и есть другой класс, реализующий клиент 1. Класс сокета.

Итак, я пытаюсь это сделать.После получения потоков я хочу, чтобы клиент отправил число на сервер, а сервер, в свою очередь, ответит клиенту, является ли он простым или нет.Который отображается в awt.Label.

Но я не могу получить ответ.

Вот код для конструктора клиента:

public ClientIsPrime()
{
    setLayout(new GridLayout(2,2));
    add(new Label("Enter a number: "));
    add(numEntry=new TextField(10));
    add(checkPrime=new Button("Check if number is Prime"));
    add(result=new Label("Result is shown here"));

    try
    {
        Socket client = new Socket(InetAddress.getLocalHost(), 5959);
        in=client.getInputStream();
        out=client.getOutputStream();
    }catch(UnknownHostException e)
    {
        result.setText("Local Host cannot be resolved");
    }catch(IOException e)
    {
        result.setText("IOException occured");
    }

    checkPrime.addActionListener(new ActionListener()
    {
        public void actionPerformed(ActionEvent ae)
        {
            try
            {
                int num;
                num=Integer.parseInt(numEntry.getText());
                out.write(num);
                out.flush();

                int c;
                result.setText("");
                String s="";
                while((c=in.read())!=-1)
                    s+=((char)c);
                result.setText(s);
            }catch(IOException e)
            {
                result.setText("IOException occured");
            }catch(NumberFormatException e)
            {
                result.setText("Please enter a valid number.");
            }
        }
    });
}

Код для сервера:

public static void main(String args[])throws IOException
{
    server=new ServerSocket(5959);

    socket=server.accept();

    System.out.println("connected");

    InputStream in=socket.getInputStream();
    OutputStream out=socket.getOutputStream();
    int c;  String numStr="";
    while((c=in.read())!=-1)
        numStr+=((char)c);
    int num=Integer.parseInt(numStr);
    if(num==3)
        out.write("Number is Prime".getBytes());
    else
        out.write("Number is not Prime".getBytes());
    out.flush();

    in.close();
    out.close();
}

Это не настоящее приложение.Я учусь.

Ответы [ 2 ]

1 голос
/ 09 января 2012

Несколько проблем.

Сначала ваша серверная реализация никогда не выйдет из цикла while. API для InputStream.read() утверждает, что он будет блокироваться до тех пор, пока данные не будут получены или поток не будет закрыт. Поток никогда не закрывается, поэтому чтение будет навсегда заблокировано после чтения исходных данных.

Чтобы решить эту проблему, вы должны решить, какой у вас протокол. Смотри ниже.

Другая проблема заключается в том, что вы пишете с клиента в виде разобранного целого текста. Так сказать 13 (как int). Но тогда вы читаете это, как если бы это была последовательность символов. 13 на проводе будет читаться как некоторый управляющий символ. Вы должны быть последовательны в том, как вы пишете и читаете данные.

Мое предложение было бы иметь базовый протокол. Используйте DataOutputStream на стороне записи и DataInputStream на стороне чтения, а затем сопоставьте вызовы чтения / записи с обеих сторон, чтобы убедиться, что вы согласны.

0 голосов
/ 09 января 2012

Если вы хотите отправлять целые числа по проводам, infinitely проще наложить DataOutputStream / DataInputStream поверх потоков необработанных сокетов и просто выполнить writeInt () и readInt ()

...