0

얼마 전 나는 소켓 연결을 생성하고 레거시 서버에 대한 단일 텔넷 연결을 위해 입력을 투입하는 프로그램을 만들었습니다. 이 프로젝트의 목표는 레거시 데이터베이스의 프론트 엔드를 작성하고 결국 현대 데이터베이스로 이동하는 것입니다. 필자는 여러 텔넷 연결로 확장 할 수 있다고 생각하는 방식으로 설정했습니다. 이제는 레거시 서버에 2-4 연결을 사용하기 시작하고 작동하지 않습니다. 그것은 항상 마지막 연결에 입력을 보냅니다. 여기에 내가 무슨 짓을했는지의 :Java로 객체 풀 만들기

1 등급 - ServerConsole

package serverconsole; 

import java.io.IOException; 
import java.net.ServerSocket; 
import java.util.ArrayList; 
import java.util.logging.FileHandler; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import java.util.logging.SimpleFormatter; 

/** 
* 
* @author Andrew 
*/ 
public class ServerConsole { 

    public static ArrayList<Boolean> busy = new ArrayList(); 
    public static ArrayList<MvTelnet> telnet = new ArrayList(); 
    static final Logger log = Logger.getLogger("errors"); 
    static FileHandler fh; 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     try (ServerSocket serverSocket = new ServerSocket(5500)) { 
      Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { 
       @Override 
       public void run() { 
        if (serverSocket != null) { 
         try { 
          serverSocket.close(); 
         } catch (IOException ex) { 
          Logger.getLogger(ServerConsole.class.getName()).log(Level.SEVERE, null, ex); 
         } 
        } 
       } 
      }, "Shutdown-thread")); 

      fh = new FileHandler("/mnt/javaprograms/ServerConsole/errors.log"); 
      log.addHandler(fh); 
      SimpleFormatter formatter = new SimpleFormatter(); 
      fh.setFormatter(formatter); 

      for(int i=0; i<2; i++) { 
       busy.add(false); 
       telnet.add(null); 
      } 

      while (true) { 
       new MultiServerThread(serverSocket.accept()).start(); 
      } 
     } catch (IOException e) { 
      System.err.println(e); 
      System.exit(-1); 
     } 
    } 

    public static void log(String str) { 
     log.info(str); 
    } 
} 

2 급 - MultiServerThread

package serverconsole; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.PrintWriter; 
import java.net.Socket; 

/** 
* 
* @author Andrew 
*/ 
public class MultiServerThread extends Thread { 

    private Socket socket = null; 

    public MultiServerThread(Socket socket) throws IOException { 
     super("MultiServerThread"); 
     this.socket = socket; 
    } 

    @Override 
    public void run() { 
     try (
       PrintWriter out = new PrintWriter(socket.getOutputStream(), true); 
       BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())) 
      ;) { 
      String input, output; 
      while (true) { 
       input = in.readLine(); 
       if (input.equals("Close")) { 
        break; 
       } 
       boolean written = false; 
       while(written == false) { 
        for (int i=0;i < ServerConsole.busy.size(); i++) { 
         if (ServerConsole.busy.get(i) == false) { 
          ServerConsole.busy.set(i, true); 
          if (ServerConsole.telnet.get(i) == null) { 
           ServerConsole.telnet.set(i, new MvTelnet()); 
          } 
          String response = ServerConsole.telnet.get(i).write(input); 
          out.println(response); 
          written = true; 
          ServerConsole.busy.set(i, false); 
          break; 
         } 
        } 
       } 
      } 
      socket.close(); 
     } catch (IOException e) { 
      ServerConsole.log(e.getMessage()); 
     } 
    } 
} 

3 급 - MvTelnet 패키지 serverconsole;

import java.io.BufferedWriter; 
import java.io.DataInputStream; 
import java.io.DataOutputStream; 
import java.io.FileOutputStream; 
import java.io.FileWriter; 
import java.io.IOException; 
import java.io.OutputStreamWriter; 
import java.text.SimpleDateFormat; 
import java.util.Calendar; 
import org.apache.commons.net.telnet.EchoOptionHandler; 
import org.apache.commons.net.telnet.InvalidTelnetOptionException; 
import org.apache.commons.net.telnet.SuppressGAOptionHandler; 
import org.apache.commons.net.telnet.TelnetClient; 
import org.apache.commons.net.telnet.TerminalTypeOptionHandler; 
import org.apache.commons.pool2.BasePooledObjectFactory; 
import org.apache.commons.pool2.ObjectPool; 
import org.apache.commons.pool2.PooledObject; 
import org.apache.commons.pool2.impl.DefaultPooledObject; 

/** 
* 
* @author Andrew 
*/ 
public class MvTelnet { 
    static TelnetClient tc = null; 
    private static DataInputStream in = null; 
    private static DataOutputStream out = null; 
    static String response = null; 
    static FileWriter fstream = null; 
    static BufferedWriter bout = null; 

    public MvTelnet() { 
     Calendar cal = Calendar.getInstance(); 
     SimpleDateFormat sdf = new SimpleDateFormat("HH-mm-ss"); 
     try { 
      tc = new TelnetClient(); 
      bout = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("/mnt/javaprograms/ServerConsole/log"+sdf.format(cal.getTime())+".txt"), "UTF-8")); 
      TerminalTypeOptionHandler ttopt = new TerminalTypeOptionHandler("VT100", false, false, true, false); 
      EchoOptionHandler echoopt = new EchoOptionHandler(true, false, true, false); 
      SuppressGAOptionHandler gaopt = new SuppressGAOptionHandler(true, true, true, true); 
      try { 
       tc.addOptionHandler(ttopt); 
       tc.addOptionHandler(echoopt); 
       tc.addOptionHandler(gaopt); 
      } catch (InvalidTelnetOptionException e) { 
       ServerConsole.log(e.getMessage()); 
      } 
      tc.connect("192.168.1.8", 2010); 
      in = new DataInputStream(tc.getInputStream()); 
      out = new DataOutputStream(tc.getOutputStream()); 
      logon(true); 
     } catch (IOException ex) { 
      ServerConsole.log(ex.getMessage()); 
     } 
    } 

    public static String write(String command) throws IOException { 
     command = command + "\n"; 
     byte[] comm = command.getBytes(); 
     out.write(comm); 
     out.flush(); 
     response = in.readLine(); 
     bout.write(response+"\n"); 
     response = in.readLine(); 
     bout.write(response+"\n"); 
     if (response.contains("[] Connect time")) { 
      logon(false); 
      out.write(comm); 
      out.flush(); 
      response = in.readLine(); 
      bout.write(response+"\n"); 
      response = in.readLine(); 
      bout.write(response+"\n"); 
     } 
     bout.flush(); 
     return response; 
    } 

    public static void close() throws IOException { 
     write("...\n"); 
     write("OFF\n"); 
     tc.disconnect(); 
    } 

    private static void logon(boolean choice) throws IOException { 
     String loginString = "JAVA-TRANS\n"; 
     byte[] logon = loginString.getBytes(); 
     if (choice == true) { 
      response = in.readLine(); 
      bout.write(response+"\n"); 
      bout.flush(); 
      response = in.readLine(); 
      bout.write(response+"\n"); 
      bout.flush(); 
      out.write(logon); 
      out.flush(); 
      response = in.readLine(); 
      bout.write(response+"\n"); 
      bout.flush(); 
      response = in.readLine(); 
      bout.write(response+"\n"); 
      bout.flush(); 
      if (!response.contains("OK")) { 
       out.write(logon); 
       out.flush(); 
       response = in.readLine(); 
       bout.write(response+"\n"); 
       bout.flush(); 
       while (!response.contains("OK")) { 
        response = in.readLine(); 
        bout.write(response+"\n"); 
        bout.flush(); 
       } 
      } 
      bout.flush(); 
     } else { 
      out.write(logon); 
      out.flush(); 
      out.write(logon); 
      out.flush(); 
      while (!response.contains("OK")) { 
       response = in.readLine(); 
       bout.write(response+"\n"); 
       bout.flush(); 
      } 
     } 
     bout.flush(); 
    } 
} 

내가했습니다 발견 아파치 공통 풀 라이브러리 이후하지만 난 풀에 개체로 내 MvTelnet 클래스를 사용하는 동안 제대로 구현하는 방법을 알아낼 수 없습니다. 공유지가 올바른 방법인가요? 그렇다면 구현 방법은 무엇입니까?

편집 : 좋아요. 의견마다 모든 코드를 추가했습니다. 내 소켓이 명령을 보낼 수있는 다양한 MvTelnet 객체 풀을 만들고 싶습니다. 나는 BC 코드에 풀 코드를 가지고 있지 않다. 그냥 엉망이었다.

+0

어떤 개체의 풀입니까? 왜? 나머지 코드는 어디에 있습니까? 질문이 뭐야? – EJP

+0

@EJP - 모든 코드를 추가했습니다. MvTelnet 객체의 풀을 원하지만 아무 것도하지 않고 오류가 발생하여 코드가 존재하지 않도록 커먼 - 풀을 만들 수 없었습니다. – andrewcole50

+1

수영장이 여기에서 도움이 될 수 있습니다. [examples] (http://commons.apache.org/proper/commons-pool/examples.html)를 참조하십시오. 'MvTelnet'을 그대로 놔두고'ServerConsole' ('telnet'과'busy' 대신)에 풀을 생성 할 수 있습니다. 'MultiServerThread'에서'ServerConsole.pool.borrowObject()'와'pool.returnObject'를 호출하십시오. 'ServerConsole'이 닫힐 때 풀을 닫는 것을 잊지 마십시오. – vanOekel

답변

0

여러 연결을 사용하여 클라이언트 - 서버를 만들려면 연결별로 하나의 스레드를 사용해야합니다. 클라이언트가 연결을 요청하면 새 클라이언트의 입력 출력을 처리 할 새 스레드를 추가하십시오.

편집 : 원할 경우 제한된 수의 스레드를 사용할 수 있습니다. 여유 공간이있는 경우에만 새 스레드를 클라이언트에 할당하는 함수를 만듭니다. 예 here

+0

나는 그것을 살펴 봤는데 내가 원하는 것을 확신하지 못했다 ... 지금 내 프로그램은 다중 연결을 받아들이고 명령을 받아서 텔넷 개체를 통해 레거시 서버로 퍼널한다. 내가 원하는 것은 레거시 서버에 대한 여러 텔넷 연결입니다 (MvTelnet 클래스를 통해 모든 정크 메일을 구문 분석하여 로그인해야 함). 레거시 서버에 대한 연결 수는 btw로 제어해야합니다. – andrewcole50