`
lx0088
  • 浏览: 3822 次
社区版块
存档分类
最新评论

浅谈单例模式

阅读更多

 

       以前开发,很少用的设计模式,即使是最简单的单例模式。

       公司有一个项目要求实现socket客户端长连接,并实现自动重连。心想,如果是长连接的话,那么肯定你的客户端端口不能变。需要绑定端口。同时要没5秒发一次心跳。因为对象绑定,所以不能重新new一个channel。当时第一反应就是单例。可能会有别的更好的方法。可以限于技术有限。不说那么多,上关键代码。不好的地方请指点,往大家勿喷!

       

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\n");
	}

}

 

分享到:
评论

相关推荐

    浅谈Spring单例Bean与单例模式的区别

    主要介绍了浅谈Spring单例Bean与单例模式的区别,具有一定借鉴价值,需要的朋友可以参考下

    浅谈C#单例模式的实现和性能对比

    主要介绍了浅谈C#单例模式的实现和性能对比的相关资料,详细的介绍了6种实现方式,需要的朋友可以参考下

    浅谈java单例设计模式

    单例模式 所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法。 如果我们要让类在一个虚拟机中只能产生一个对象: 将类的...

    浅谈Python反射 & 单例模式

    主要介绍了Python反射 & 单例模式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    浅谈Java编程中的单例设计模式

    主要介绍了Java编程中的单例设计模式,在许多语言的编程过程当中单例模式都被开发者们广泛采用,需要的朋友可以参考下

    浅谈JAVASE单例设计模式

    整理笔记的时候发现以前写的单利设计模式的文章,贴出来给大家分享下!有需要的小伙伴可以来参考下

    Java设计模式 版本2

    前言,UML建模技术,深入浅出UML类图,从招式与内功谈起——设计模式概述,面向对象设计原则,工厂三兄弟之简单工厂模式,工厂三兄弟之工厂方法模式,工厂三兄弟之抽象工厂模式,确保对象的唯一性——单例模式,...

    design-pattern-java.pdf

    工厂三兄弟之抽象工厂模式(二) 工厂三兄弟之抽象工厂模式(三) 工厂三兄弟之抽象工厂模式(四) 工厂三兄弟之抽象工厂模式(五) 单例模式-Singleton Pattern 确保对象的唯一性——单例模式 (一) 确保对象的...

    Think in ActionScript 3.0Ⅰ Ⅱ Ⅲ汇总

    4.7.4 单例模式(Singleton Pattern) 5. 多态(Polymorphism) 5.1 多态的概念 5.2 多态存在的三个必要条件 5.3 TestPolymoph.as —— 多态的应用,体会多态带来的好处 5.4 TestPolymoph 内存分析 5.5 多态的好处 ...

    Python-高频-面试-知识点

    11.单例模式的几种实现方式的及优化? 3 12.作用域的类型有哪些? 5 13.深拷贝和浅拷贝的区别? 5 14.多线程和多进程的区别? 6 15.is是对比地址,==是对比值 6 16. read,readline和readlines 6 17.闭包 6 18.垃圾...

    传智播客扫地僧视频讲义源码

    本教程共分为5个部分,第一部分是C语言提高部分,第二部分为C++基础部分,第三部分为C++进阶部分,第四部分为C、C++及数据结构基础部分,第五部分为C_C++与设计模式基础,内容非常详细. 第一部分 C语言提高部分目录...

Global site tag (gtag.js) - Google Analytics