2012-02-26 3 views
0

Я написал эту простую программу Java, которая подключается к внутреннему серверу и возвращает данные о домене. Тем не менее, у меня возникла странная проблема. Я могу казаться глупым, но вот программа!Использование буферизованного считывателя и Socket

import java.io.*; 
import java.net.*; 
public class SocketTest { 
    public static void main(String[] args) { 
     String hostName; 
     int i = 0; 

     try {     
      Socket socketClient = new Socket("whois.internic.net", 43); 
      BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); 
      InputStream in = socketClient.getInputStream(); 
      OutputStream out = socketClient.getOutputStream(); 
      System.out.println("Please Enter the Host Name!!"); 
      hostName = bf.readLine();  
      hostName = hostName + "\n"; 
      byte[] buf = hostName.getBytes(); 
      out.write(buf); 

      while((i = in.read()) != -1) { 
       System.out.print((char)i); 
      } 

      socketClient.close(); 
     } catch(UnknownHostException uht) { 
      System.out.println("Host Error"); 
     } catch(IOException ioe) { 
      System.out.println("IO Error " + ioe); 
     } catch(Exception e) { 
      System.out.println("Exception " + e); 
     } 
    } 
} 

Программа работает нормально, без каких-либо ошибок во время выполнения, но он не показывает выхода, когда я пытаюсь напечатать результат от Internic сервера в последней части Ьги блока. Я попробовал переупорядочить код и обнаружил, что если я поместил bf.readLine() после создания потоков сокетов, выхода нет. Однако, если я помещаю его перед созданием сокета (в начале основного метода), программа отображает предполагаемый вывод.

Есть ли какой-либо конфликт или так? Я новичок в сети на Java. Решение может быть очевидным, но я не могу понять! Пожалуйста, помогите мне!!!

+0

Вы должны отступа код правильно, это нечитаемо. – skaffman

ответ

1

Переместите входной поток инициализации после того, как вы отправите домен в выходной поток ... Это работает для меня на месте:

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

public class SocketTest { 
    public static void main(String[] args) { 
     String hostName; 
     int i = 0; 
     try { 
      Socket socketClient = new Socket("whois.internic.net", 43); 
      BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); 

      OutputStream out = socketClient.getOutputStream(); 
      System.out.println("Please Enter the Host Name!!"); 
      hostName = bf.readLine(); 
      hostName = hostName + "\n"; 
      byte[] buf = hostName.getBytes(); 
      out.write(buf); 

      InputStream in = socketClient.getInputStream(); 
      while ((i = in.read()) != -1) { 
       System.out.print((char) i); 
      } 
      in.close(); 
      out.close(); 
      socketClient.close(); 

     } catch (UnknownHostException uht) { 
      System.out.println("Host Error"); 
     } catch (IOException ioe) { 
      System.out.println("IO Error " + ioe); 
     } catch (Exception e) { 
      System.out.println("Exception " + e); 
     } 
    } 
} 

Выход:

Please Enter the Host Name!! 
yahoo.com 

Whois Server Version 2.0 

Domain names in the .com and .net domains can now be registered 
with many different competing registrars. Go to http://www.internic.net 
for detailed information. 

YAHOO.COM.ZZZZZZZ.GET.ONE.MILLION.DOLLARS.AT.WWW.UNIMUNDI.COM 
YAHOO.COM.ZZZZZZ.MORE.INFO.AT.WWW.BEYONDWHOIS.COM 
....Whole bunch more 
Смежные вопросы