2012-01-08 3 views
0

У меня есть класс, реализующий класс serverocket, и есть другой класс, реализующий клиент 1. Класс Socket.Сокет не может получить данные

Так что я пытаюсь это сделать. После получения потоков я хочу, чтобы клиент отправил число на сервер, и сервер, в свою очередь, будет отвечать клиенту, является ли он простым или нет. Что отображается в 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(); 
} 

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

+0

Реализация простого числа неправа .. но не нуждается в каких-либо вещах. Просто нужно проверить, передаются ли сообщения или нет .. то, что сделано .. я бы очень хорошо написал реализацию простого числа. – ritesht93

+0

Из того, что я знаю о сокетах Java, вы делаете это правильно. Переправляются ли ваши порты и ваш брандмауэр? – Axis

+0

Итак, чтобы уточнить: является ли проблема, что сервер получает простое число, но что клиент никогда не получает ответ? – chradcliffe

ответ

0

Если вы хотите отправить через целые провода это infinitely легче слой с DataOutputStream/DataInputStream поверх исходных потоков сокетов и вобще WriteInt() и readInt()

+0

Хм, это нормально..i Знаю, что .. я даже могу использовать ObjectInputStream .. Но я хочу попробовать с потоками ввода и вывода .. это должно работать так же ..! Учимся .. Просто хотел попробовать это .. – ritesht93

+0

и в любом случае спасибо за ответ ..! :) – ritesht93

1

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

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

Для решения этой проблемы вы должны решить, что такое ваш протокол. Смотри ниже.

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

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

+0

Hmm ok..and for read() case..что бы я мог использовать метод available() в условии IF, а затем ввести цикл. и что, если я передаю переменную num в виде строки. нанизывать().. – ritesht93

+0

Если вы хотите понять, что происходит, я бы прочитал исходный код DataInput/OutputStream и посмотрел, что он делает. Понимание того, что/как/почему это делает то, что он делает, хорошо. Переосмыслить колесо, кроме этого, нет. –

+0

Хм..ок..так, я думаю, наконец, было бы лучше использовать потоки данных/объектов, тогда ... спасибо за ваш ответ! – ritesht93

Смежные вопросы