我关于用servlet做ServerSocket的构思!请高人指点!
我要用java开发一个聊天程序。applet为客户端,用servlet做网关,
所有信息都要由applet发送到servlet,再由servlet转发到核心服务器。
同时信息的返回也是同样的方向相反!
我的构想:
第一种方案:
applet和servlet用socket方式通信。即applet为Socket,servlet为
ServerSocket,同时servlet也是核心服务器的客户端。即servlet里
也建立一个Socket,作为客户端和核心服务器通信。
现在有几个问题:
1.servlet要是作为服务器端,就要时时侦听客户端的连接。可是servlet
在servlet引擎中只是建立了一个实例,每一个请求都要生成一个线程,进
行处理。是无法做到时时侦听。我的理解对不对?
2.如果servlet初始化时就建立一个线程,功能就是时时侦听,那是不是就
可以了,applet向servlet发消息,都由这个线程侦听到,然后建立一个响
应进程,与applet通信,把applet发来的消息通过在servlet里作为静态变
量的Socket传到核心服务器上.但是当有消息从核心服务器上发来时,我却
又不知道该怎么办了。
3.在2的基础上,响应进程一得到连接,就建立一个Socket与核心服务器连接
(即一个applet客户端对应一个servlet的服务器socket响应进程对应一个
servlet的socket客户端),把消息发到核心服务器上,然后启动一个时时监
测核心服务器上的返回信息的进程,得到返回消息,返回给applet.
4.2的基础上,把servlet的Socket也建立到一个进程中,既是在侦测进程中,
当侦测到连接,启动响应进程,得到消息,然后启动这个进程和核心服务器连
接,把applet传来的消息传到这个进程中去,让这个进程再把其传到核心服务
器上去。当有消息返回时,这个进程得到返回消息,再把消息传到响应进程,
返回applet。
2.3.4都有一个问题:不同进程之间变量(其实就是对象)的传递,如何把变量
传到一个进程中去?怎么实现呢?
(1)是不是可以把这些进程类(主要是响应进程和与核心服务器通信的进程)
都从一个父类中继承,用这个父类的方法和静态变量传消息内容,但是用父类
的静态变量传,现实中这样的进程肯定不只是一个,静态变量会被别的进程修改
的,所以不行。
(2)或者使用Synchronized,对对象加锁,在同一时间内只能被一个进程访问。
那么我不能确定被哪一个进程访问,即核心服务器返回的消息放到一个加锁对象
里,我怎么能过要让与这个消息相对应的那个连接进程得到这个消息。
现在思路比较乱!不知我对servlet的理解对不对?最后我认为问题的核心在于
servlet不能像application常驻内存!还有就是这个网关既是applet的服务器又
是核心服务器的客户端。
如果用application,网关一直在监测applet的连接,一得到连接就建立连接线程,
在线程中建立与核心服务器的连接,发消息到核心服务器,受到消息后返回applet,
但是这样就是阻塞的了,是不是可以通过setSoTimeOut(),来防止阻塞?还有就是在
通话过程中applet-网关serverSocket-网关clientSocket-核心服务器始终保持连接。
我要是做成非阻塞的呢?能给我一点启发吗?谢谢!
说了这么多,我都不好意思了。浪费你太多的时间,谢谢您的耐心的阅读,只有由耐
心阅读完的人才是真正的java爱好者,请你们指点一下!!