2016-05-17 2 views
0

Я пытаюсь подключиться к серверу telnet, но когда я подключаюсь к серверу telnet, работающему на порте 9999., но когда я запускаю этот код. он показывает приветственное сообщение, но тогда никакая команда не работает.Возможно подключиться к сокету telnet

public static void main(String[] args) { 
    FileOutputStream fos = null; 
    final String server = "erdos.dsm.fordham.edu"; 
    final int port = 9999; 

    Socket sock = null; 
    PrintWriter out = null; 
    BufferedReader in = null; 
    try { 
     sock = new Socket(server,port); 
     sock.setKeepAlive(true); 

     out = new PrintWriter(sock.getOutputStream(),true); 
     in = new BufferedReader(new InputStreamReader(sock.getInputStream())); 
    } catch (IOException ex) { 
     Logger.getLogger(Hangman.class.getName()).log(Level.SEVERE, null, ex); 
    } 
    try { 

     System.out.println(in.readLine()); 

     Scanner scanner = new Scanner(System.in); 
     String s = scanner.nextLine(); 
     s = s.toUpperCase(); 
    while(!s.equals("QUIT")) 
    { 

     out.print(s); 
     out.flush(); 
     System.out.println(in.read()); 
     s = scanner.nextLine(); 
    } 
     System.out.println("Thanks for playing bye"); 

    } catch (IOException ex) { 
     Logger.getLogger(Hangman.class.getName()).log(Level.SEVERE,null, ex); 
    } 
} 

ответ

0

Редакция: См первой версии с помощью предыдущей версии ответа

Это жутко, но это работает. Поскольку я не смог найти terminaison для входящих данных после команды, я решил добавить Runnable + Thread, который читает, и метод в нем, который принимает то, что было прочитано, ожидая 100 мс (или, если необходимо, до), прежде чем рассматривать все данные были получены.

package base_test; 

import java.io.BufferedReader; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.PrintWriter; 
import java.net.Socket; 
import java.util.Scanner; 

public class Main { 

    public static void main(String[] args) { 
     FileOutputStream fos = null; 
     final String server = "erdos.dsm.fordham.edu"; 
     final int port = 9999; 

     Socket sock = null; 
     PrintWriter out = null; 
     BufferedReader in = null; 
     try { 
      sock = new Socket(server, port); 
      sock.setKeepAlive(true); 

      out = new PrintWriter(sock.getOutputStream(), true); 
      in = new BufferedReader(new InputStreamReader(sock.getInputStream())); 
     } catch (IOException ex) { 
      ex.printStackTrace(); 
      // Logger.getLogger(Hangman.class.getName()).log(Level.SEVERE, null, 
      // ex); 
     } 

     //Start a different that listen to incoming data 
     DataReader dr = new DataReader(in); 
     Thread dataThread = new Thread(dr); 
     dataThread.start(); 


     try { 

      Scanner scanner = new Scanner(System.in); 
      String s = ""; 
      do { 
       System.out.println(dr.getLastData()); 

       s = scanner.nextLine(); 
       s = s.toUpperCase(); 
       if (s.isEmpty()) 
        continue; 

       out.println(s); 
      } while (!s.equals("QUIT")); 
      System.out.println("Thanks for playing bye"); 

     } catch (Exception ex) { 
      ex.printStackTrace(); 
      // Logger.getLogger(Hangman.class.getName()).log(Level.SEVERE,null, 
      // ex); 
     } 
    } 
} 

класс DataReader:

package base_test; 

import java.io.BufferedReader; 
import java.util.LinkedList; 

public class DataReader implements Runnable { 

    private final int MAX_WAITING_LOOPS = 100; 

    private LinkedList<StringBuilder> receivedData = new LinkedList<>(); 
    private BufferedReader in; 
    private boolean isWaiting = true; 
    private boolean isReceiving = false; 

    public DataReader(BufferedReader in) { 
     this.in = in; 
     receivedData.push(new StringBuilder()); 
    } 

    @Override 
    public void run() { 
     do { 
      try { 
       isWaiting = true; 

       char last = (char)in.read(); 
       StringBuilder sb = receivedData.peek(); 
       sb.append(last); 

       isWaiting = false; 
       isReceiving = true; 
      } catch(Exception e) { 
       e.printStackTrace(); 
      } 

     } while (true); 
    } 

    public String getLastData() throws InterruptedException { 
     int loopCount = 0; 

     while (loopCount < MAX_WAITING_LOOPS) { 
      if (isReceiving == false || isWaiting == false) { 
       //System.out.println("===RESET"); 
       loopCount = 0; 
      } else { 
       loopCount++; 
      } 
      Thread.sleep(1); 
     } 

     isReceiving = false; 

     receivedData.push(new StringBuilder()); 
     StringBuilder sb = receivedData.pollLast(); 
     return sb.toString(); 
    } 
} 
+0

благодаря она работает очень хорошо, но не читает всю строку, например, если я печатаю помочь Это будет просто вернуть первую строку –

+0

Да. Я знаю, потому что между первой строкой и остальными есть строка. Вы закодировали серверную часть? –

+0

Терминатор линии в Telnet - '\ r \ n', а не' \ n'. Вы не тестируете 'readLine()' return null, и тест для пустой строки кажется бессмысленным. – EJP