我关于用servlet做ServerSocket的构思!请高人指点!

松耦合紧内聚 2002-03-31 07:38:22
我要用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爱好者,请你们指点一下!!
...全文
174 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
qianying 2002-04-01
  • 打赏
  • 举报
回复
我也想知道
松耦合紧内聚 2002-03-31
  • 打赏
  • 举报
回复
还有补充:如果applet到servlet用http传信息,那不就没有互交性了吗?
我可以发一个消息给servlet,servlet传到服务器,但是服务器如何发到接受的客户端呢?也就是说我又如何接到别人给我的消息那?我和servlet只有一次tcp连接
,我发一个消息,可以得到一个返回,但是总给由第一个人发消息给别人吧,那么那个人如何让接收者得到消息呢?接收者也许并正在没有和servlet通话呀!
我的系统就像qq那样,要做成applet,但是用户用户之间要通过web网关和服务器连接,不是用udp
,比较异类!
松耦合紧内聚 2002-03-31
  • 打赏
  • 举报
回复
servlet的那个socket在那?
我是想建立一个socket和核心服务器连接呀。
我有了一个想法:
就是在servlet里只启动一个线程,当作application时时侦听连接和与核心server连接。
就是在第一个客户端用http请求连接时,启动这个线程,建立ServerSocket&Socket(to 核心Server),在servlet里用静态变量设置一个标志,
说明是否以建立侦听和是否连接核心server,以后如果再有客户端发http要求连接,先检查标志,如果已经起动线程,就在applet里直接建立Socket和servlet的线程连接。这样可行吗?
Guanghuan 2002-03-31
  • 打赏
  • 举报
回复
你的Applet尊循HTTP协议,收发数据。Servlet直接处理doPost就行了。
Servlet本身就有个Socket,还写Socket干吗,而且你另外写个Socket用不了80端口,不容易通过防火墙。

23,407

社区成员

发帖
与我相关
我的任务
社区描述
Java 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧