关于将socket对象作为单例类的成员变量

问题描述

业务场景:1、系统在初始化时创建Socket对象(客户端)2、将创建的Socket对象作为系统全局变量,共其他方法使用。我的实现思路方法大致如下://系统初始化类publicclassInitialize{publicvoidinit(){Socketsocket=newSocket(ipAddress,port);//创建socket连接SocketSingleIntancessi=SocketSingleIntance.getSingleIntance();//将socket交由单例类维护ssi.setSocket(socket);}}//单例类:publicclassSocketSingleIntance{privateSocketsocket;privatestaticSocketSingleIntancesocketSingleIntance;privateSocketSingleIntance(){}publicstaticSocketSingleIntancegetSingleIntance(){if(null==socketSingleIntance){socketSingleIntance=newSocketSingleIntance();}returnsocketSingleIntance;}//socket赋值publicvoidsetSocket(Socketsocket){this.socket=socket;}//对外提供访问publicSocketgetSocket(){returnthis.socket;}}//系统其他方法访问publicclassTest{SocketSingleIntancessi=SocketSingleIntance.getSingleIntance();Socketsocket=ssi.getSocket();//取出创建的socket对象InputStreamis=socket.getInputStream();//获取服务端数据。。。。。。。。。。。。}

请问这样写是否有问题,请大家给点意见。如果有更好的实现方法,请赐教!

解决方案

解决方案二:
为什么要作为一个成员变量呢,客户端只有一个吗
解决方案三:
没人来指点一下吗?做公交的路上来了点灵感,感觉应将创建socket放到单例类里面去创建,改动后代码://系统初始化类publicclassInitialize{publicvoidinit(){//Socketsocket=newSocket(ipAddress,port);//此处放到单例类里去创建SocketSingleIntancessi=SocketSingleIntance.getSingleIntance();//ssi.setSocket(socket);}}//单例类:publicclassSocketSingleIntance{privateSocketsocket;privatestaticSocketSingleIntancesocketSingleIntance;privateSocketSingleIntance(){this.socket=newSocket(ipAddress,port);//创建socket连接}publicstaticSocketSingleIntancegetSingleIntance(){if(null==socketSingleIntance){socketSingleIntance=newSocketSingleIntance();}returnsocketSingleIntance;}//对外提供访问publicSocketgetSocket(){returnthis.socket;}}//系统其他方法访问publicclassTest{SocketSingleIntancessi=SocketSingleIntance.getSingleIntance();Socketsocket=ssi.getSocket();//取出创建的socket对象InputStreamis=socket.getInputStream();//获取服务端数据。。。。。。。。。。。。}

大家给点意见吧!!!
解决方案四:
引用1楼u011643314的回复:

为什么要作为一个成员变量呢,客户端只有一个吗

客户端不只是一个,是多个客户端只与一个服务器的端口进行通信。
解决方案五:
引用2楼tengcong5210的回复:

没人来指点一下吗?做公交的路上来了点灵感,感觉应将创建socket放到单例类里面去创建,改动后代码://系统初始化类publicclassInitialize{publicvoidinit(){//Socketsocket=newSocket(ipAddress,port);//此处放到单例类里去创建SocketSingleIntancessi=SocketSingleIntance.getSingleIntance();//ssi.setSocket(socket);}}//单例类:publicclassSocketSingleIntance{privateSocketsocket;privatestaticSocketSingleIntancesocketSingleIntance;privateSocketSingleIntance(){this.socket=newSocket(ipAddress,port);//创建socket连接}publicstaticSocketSingleIntancegetSingleIntance(){if(null==socketSingleIntance){socketSingleIntance=newSocketSingleIntance();}returnsocketSingleIntance;}//对外提供访问publicSocketgetSocket(){returnthis.socket;}}//系统其他方法访问publicclassTest{SocketSingleIntancessi=SocketSingleIntance.getSingleIntance();Socketsocket=ssi.getSocket();//取出创建的socket对象InputStreamis=socket.getInputStream();//获取服务端数据。。。。。。。。。。。。}

大家给点意见吧!!!

这样写没有问题,但是如果是做通信方面的话,那么使用单例就有问题了!
解决方案六:
引用4楼zy353003874的回复:

Quote: 引用2楼tengcong5210的回复:
没人来指点一下吗?做公交的路上来了点灵感,感觉应将创建socket放到单例类里面去创建,改动后代码://系统初始化类publicclassInitialize{publicvoidinit(){//Socketsocket=newSocket(ipAddress,port);//此处放到单例类里去创建SocketSingleIntancessi=SocketSingleIntance.getSingleIntance();//ssi.setSocket(socket);}}//单例类:publicclassSocketSingleIntance{privateSocketsocket;privatestaticSocketSingleIntancesocketSingleIntance;privateSocketSingleIntance(){this.socket=newSocket(ipAddress,port);//创建socket连接}publicstaticSocketSingleIntancegetSingleIntance(){if(null==socketSingleIntance){socketSingleIntance=newSocketSingleIntance();}returnsocketSingleIntance;}//对外提供访问publicSocketgetSocket(){returnthis.socket;}}//系统其他方法访问publicclassTest{SocketSingleIntancessi=SocketSingleIntance.getSingleIntance();Socketsocket=ssi.getSocket();//取出创建的socket对象InputStreamis=socket.getInputStream();//获取服务端数据。。。。。。。。。。。。}

大家给点意见吧!!!

这样写没有问题,但是如果是做通信方面的话,那么使用单例就有问题了!

说的对,如果用到多线程进行通信的话估计就不合适了
解决方案七:
会有并发问题,当多个人读写这个socket的时候...
解决方案八:
我建议这个socket用阻塞队列来实现,用之前先take()用完再放回去。
解决方案九:
感谢大家的回复,看了一下,主要是要让此单例实现线程安全对吧!网上看了一下,有好多关于处理多线程单例的!

时间: 2024-12-08 18:34:32

关于将socket对象作为单例类的成员变量的相关文章

iOS - OC SingleClass 单例类

前言 对于一个单例类,无论初始化单例对象多少次,在程序的整个生命周期内,只会创建一个类的实例对象,而且只要程序不被杀死,该实例对象就不会被释放,并且该对象是全局的,能够被整个系统访问到. 在应用这个模式时,单例对象的类必须保证只有一个实例存在.许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为.比如在 APP 开发中我们可能在任何地方都要使用用户的信息,那么可以在登录的时候就把用户信息存放在一个文件里面,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这

iOS - Swift SingleClass 单例类

前言 单例对象能够被整个程序所操作.对于一个单例类,无论初始化单例对象多少次,也只能有一个单例对象存在,并且该对象是全局的,能够被整个系统访问到. 单例类的创建 1.1 单例类的创建 1 单例类的创建 class SingleClass1 { var text:String = "default" class var sharedInstance: SingleClass1 { struct Static { static var onceToken: dispatch_once_t

PHP里的单例类写法实例

  这篇文章主要介绍了PHP里的单例类写法实例,本文直接给出代码实例,需要的朋友可以参考下 PHP里的单实例类在进行数据交换,节省内存上还是很有意义的.写个简单例子. 类1,单实例类本身: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 class UTIL { private static $instance; public function get() { if (!self::$instance) { self::$instance = new UTIL(

设计一个不强引用对象的单例字典

设计一个不强引用对象的单例字典 大家都知道,使用NSDictionary存储对象的时候会强引用对象,导致被存储对象的引用计数+1,有时候,我们想用单例来存储对象,但又不希望强引用存储的对象,这该怎么实现呢? 在这里,我们可以使用NSMapTable来实现这个功能. 我直接给出源码: WeakDictionary.h   +   WeakDictionary.m // // WeakDictionary.h // 弱引用字典 // // http://www.cnblogs.com/YouXian

PHP里的单例类写法实例_php实例

PHP里的单实例类在进行数据交换,节省内存上还是很有意义的.写个简单例子. 类1,单实例类本身: class UTIL { private static $instance; public function get() { if (!self::$instance) { self::$instance = new UTIL(); } return self::$instance; } public $number = 10; public function change($num) { $thi

c++的问题-关于类的成员变量指向在堆上的对象的选择:指针/auto_ptr<>/shared_ptr<> ?

问题描述 关于类的成员变量指向在堆上的对象的选择:指针/auto_ptr<>/shared_ptr<> ? 在堆上的对象作为一个类的一个成员变量,我了解到的至少有三种方式(如下所示): class A{ } class B{ A* m_pA1; auto_ptrm_pA2: shared_ptrm_pA3: } B::B():m_pA1(new A)m_pA2(auto_ptr(new A))m_pA3(shared_ptr(new A)){ } 针对这三种方案,在什么情况下选择哪

c#-C#点击按钮改变类的成员变量的值

问题描述 C#点击按钮改变类的成员变量的值 我在类里面定义了一个成员变量n,想用点击按钮来改变它的值,在按钮方法里面实现了,但是再在其他方法里面将n赋给其他变量的时候却不能实现. 解决方案 肯定也是可以实现的 比如 public void Foo(int a){ this.n=a; } 你调用这个方法不可能n的值不变吧? 解决方案二: 估计是你的对象是私有的,或者你在其它方法访问的时候又创建了一个.你可以把对象定义成static形式看看. 解决方案三: 总之就是 xxxx.n = xxx 解决方

myapplication-继承自MyApplication的类的成员变量会被释放,设置为Null吗

问题描述 继承自MyApplication的类的成员变量会被释放,设置为Null吗 分析统计数据,发现APP经常由于空指针错误发生崩溃,主要使用场景是因为APP切换到后台,内存被回收. 有两个问题: 1.Android APP在模拟器开发中怎么模拟内存不足? 2.继承自MyApplication的类的成员变量会被释放,设置为Null吗? 请问怎么解决,有相关的日志吗? 解决方案 application一般保存一些全局对象,不会被释放,除非你自己释放,模拟内存不足,模拟器中(比如创建时)是可以设置

c++-MFC怎么在普通的函数中操作窗口类的成员变量

问题描述 MFC怎么在普通的函数中操作窗口类的成员变量 例如我想在函数f中操作CtestDlg类的变量e.该怎么做? 解决方案 定义一个全局变量 CtestDlg dlg 创建对话框给它赋值 e定义成public的 用dlg.e 得到变量. 解决方案二: 类的普通成员函数的指针类普通成员函数与函数的区别类成员函数与普通函数的区别 解决方案三: 给函数传入形参,用引用&实现