Использование Buffered Reader и Socket - PullRequest
0 голосов
/ 26 февраля 2012

Я написал эту простую Java-программу, которая подключается к внутреннему серверу и возвращает сведения о домене. Однако я сталкиваюсь со странной проблемой. Я могу звучать глупо, но вот программа!

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);
        }
    }
}

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

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

1 Ответ

1 голос
/ 26 февраля 2012

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

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...