단일 사례 모델 에 대하 여 논 하 다.

2425 단어 자바단일 모드

       예전 에 개 발 된 디자인 모델 은 가장 간단 한 단일 모델 이라도 거의 사용 되 지 않 았 다.
       회사 에 서 는 socket 클 라 이언 트 의 긴 연결 을 실현 하고 자동 재 연결 을 실현 하 는 프로젝트 가 있 습 니 다.긴 연결 이 라면 클 라 이언 트 포트 가 변 하지 않 을 것 이 라 고 생각 합 니 다.연결 포트 가 필요 합 니 다.동시에 5 초 에 한 번 도 심장 박동 을 하지 않 아야 한다.대상 이 연결 되 어 있 기 때문에 새로운 채널 을 다시 만 들 수 없습니다.당시 첫 반응 은 단 례 였 다.다른 더 좋 은 방법 이 있 을 거 예요.기술 에 한계 가 있다.그렇게 많은 것 은 말 하지 않 고 핵심 코드 를 달 아 라.좋 지 않 은 곳 을 가르쳐 주 십시오.모두 에 게 뿌리 지 마 세 요!
       
private static MySocketClient mySocketClient;
	private Selector selector;
	private SocketChannel sc ;
	
	
	private MySocketClient(String ip,int port){
		try {
			this.init(ip, port);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public static MySocketClient getInstance(String ip,int port){
		if(mySocketClient == null){
			mySocketClient = new MySocketClient(ip,port);
		}
		return mySocketClient;
	}
	
	public void init(String ip,int port) throws Exception{
		try {
			selector = Selector.open();
			sc = SocketChannel.open();
			sc.socket().bind(new InetSocketAddress(Config.getLocalhostPort()));
			boolean b = sc.connect(new InetSocketAddress(InetAddress.getByName(ip), port));
			System.out.println("    : "+b);
			sc.configureBlocking(false);
			sc.register(selector, SelectionKey.OP_READ);
			new Thread(new Listener(selector)).start();
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public void sendMessage(String msg){
		try {
			sc.write(ByteBuffer.wrap(msg.getBytes("gbk")));
		} catch (IOException e) {
			try {
				sc.close();
				mySocketClient = null;
			} catch (IOException e1) {
				e1.printStackTrace();
			}
			e.printStackTrace();
		}
	}

 
		Timer timer = new Timer();
		timer.schedule(new MyTask(), 1000*2, 1000*20);

 
public class MyTask extends TimerTask {

	@Override
	public void run() {
		MySocketClient myc = MySocketClient.getInstance(Config.getHostIp(), Config.getHostPort());
		myc.sendMessage("$PX\r
"); } }

좋은 웹페이지 즐겨찾기