얼마 전 나는 소켓 연결을 생성하고 레거시 서버에 대한 단일 텔넷 연결을 위해 입력을 투입하는 프로그램을 만들었습니다. 이 프로젝트의 목표는 레거시 데이터베이스의 프론트 엔드를 작성하고 결국 현대 데이터베이스로 이동하는 것입니다. 필자는 여러 텔넷 연결로 확장 할 수 있다고 생각하는 방식으로 설정했습니다. 이제는 레거시 서버에 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 코드에 풀 코드를 가지고 있지 않다. 그냥 엉망이었다.
어떤 개체의 풀입니까? 왜? 나머지 코드는 어디에 있습니까? 질문이 뭐야? – EJP
@EJP - 모든 코드를 추가했습니다. MvTelnet 객체의 풀을 원하지만 아무 것도하지 않고 오류가 발생하여 코드가 존재하지 않도록 커먼 - 풀을 만들 수 없었습니다. – andrewcole50
수영장이 여기에서 도움이 될 수 있습니다. [examples] (http://commons.apache.org/proper/commons-pool/examples.html)를 참조하십시오. 'MvTelnet'을 그대로 놔두고'ServerConsole' ('telnet'과'busy' 대신)에 풀을 생성 할 수 있습니다. 'MultiServerThread'에서'ServerConsole.pool.borrowObject()'와'pool.returnObject'를 호출하십시오. 'ServerConsole'이 닫힐 때 풀을 닫는 것을 잊지 마십시오. – vanOekel