问题描述
业务场景: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()用完再放回去。
解决方案九:
感谢大家的回复,看了一下,主要是要让此单例实现线程安全对吧!网上看了一下,有好多关于处理多线程单例的!