servlet中使用serversocket求助

seanwanxin 2011-04-19 10:05:55
各位大侠,我最近在做一个java web的课程项目的时候碰到了些问题,向你们求助。
要在本地服务器上开一个ServerSocket来实时接收Client发送过来的数据,然后将这个数据从本地服务器转发到中心服务器。
中心服务器对数据处理完成后,会通知本地服务器。本地服务器使用servlet接收中心服务器的响应。
最后,本地服务器的servlet对响应信息进行处理后,再使用socket发送给client,一次交互就这样完成了。

想问下大家这个过程是否可行,现在是想在本地服务器的servlet的init方法中开启线程实现serversocket,侦听端口,然后发送至中心服务器。在本地服务器servlet中的doPost里面接收中心服务器的响应,然后新建socket将响应数据发送给客户端。

如果不能这样的话,大家能不能给我一个解决方案,谢谢了。

如果可以的话,大家能不能给我一点相关的代码做下参考,再次谢谢大家~~
...全文
290 点赞 收藏 5
写回复
5 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
wshcdr 2011-04-20
还有一个

使用Servlet上下文有关的侦听器
步骤:
(一)
创建一个Listener 类 实现接口:ServletContextListener
实现接口的两个方法:
package com.bjmobile.action;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
/**
* 侦听器类 和Timer 结合起来 完成侦听定时执行任务;
* @author new
*
*/
public class ContextListener implements ServletContextListener {
private java.util.Timer timer = null;

public void contextInitialized(ServletContextEvent event) {
timer = new java.util.Timer(true);// true表明定义为守护线程;
System.out.println("定时器已启动");
// 定时器调度语句,其中MyTask是自定义需要被调度的执行任务
// 初始化时就 执行一次任务;
//此例为每隔三分钟执行一次任务;
timer.schedule(new MyTask(), 0, 3 * 60 * 1000);
System.out.println("已经添加任务调度表");
}
public void contextDestroyed(ServletContextEvent event) {
timer.cancel();
System.out.println("定时器销毁");
}
}

(二)
创建一个任务类MyTask:继承TimerTask类
把任务写在run方法中:
package com.bjmobile.action;

import java.util.Calendar;
import java.util.TimerTask;

// 定时执行的任务类
public class MyTask extends TimerTask {
private static final int C_SCHEDULE_HOUR = 11;
private static boolean isRunning = false;
public void run() {
Calendar cal = Calendar.getInstance();
if (!isRunning) {
if (C_SCHEDULE_HOUR == cal.get(Calendar.HOUR_OF_DAY)) {
//时间为11点时才执行任务,否则不执行;
//所以调度器timer.schedule的间隔时间不能大于一小时,否则可能错过时间段;
//调度器timer.schedule的间隔时间也不能小于一小时,否则可能一天执行几次任务;
isRunning = true;
System.out.println("开始执行指定任务");

// TODO 添加自定义的详细任务,以下只是示例
int i = 0;
while (i++ < 5) {
System.out.println("已完成任务的" + i + "/" + 10);
}
//end

isRunning = false;
System.out.println("指定任务执行结束");
} else {
System.out.println("还不到任务执行的时间");
}
} else {
System.out.println("上一次任务执行还未结束");
}
}
}

(三)
在 web.xml文件中配置 Listener 类:
<listener>
<listener-class>com.bjmobile.action.ContextListener</listener-class>
</listener>

回复
wshcdr 2011-04-20
看到别人的做法:
使用一个专门的servlet,把任务调度器初始化放在servlet的init方法中,设置web服务器自动加载此servlet
步骤:
(一)
创建一个TaskServlet 类

package com.bjmobile;

import java.util.Calendar;
import java.util.Timer;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
/**
* servlet 和Timer 结合起来 完成侦听定时执行任务,在初始化时加载调度器;
* @author new
*
*/
public class TaskServlet extends HttpServlet {

private static final long serialVersionUID = 1L;
Timer timer = new Timer();
public void init() throws ServletException {
String sendmailhour = "14";
String sendmailminutes = "04";
String sendmailsecond = "30";
// 设置首次执行时间;
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY, Integer.parseInt(sendmailhour));
cal.set(Calendar.MINUTE, Integer.parseInt(sendmailminutes));
cal.set(Calendar.SECOND, Integer.parseInt(sendmailsecond));
System.out.println("******* 1. current time:"+cal.getTime());

// 由于timer初始化时,如果定时器定的当天的时间已经过去了马上执行一次任务,
// 如果当天的时间还不到,则等时间到了 再执行任务;
// 定时器调度语句,其中TestTask是自定义需要被调度的执行任务
// cal.getTime()为首次执行时间;
// 此例以后过24小时执行一次任务;
timer.schedule(new TestTask(), cal.getTime(), 24 * 60 * 60 * 1000);
System.out.println("定时器2已启动");
}

@Override
public void destroy() {
// TODO Auto-generated method stub
super.destroy();
timer.cancel(); //要主动销毁;否则关闭项目应用时,定时器没被销毁
System.out.println("定时器2销毁!");
}
}

(二)
创建一个任务类TestTask:继承TimerTask类
把任务写在run方法中:
package com.bjmobile;
import java.util.TimerTask;

// 定时执行的任务类
public class TestTask extends TimerTask {
public void run() {

System.out.println("执行任务");

}
}

(三)
在 web.xml文件中配置 servlet 类:
<servlet>
<servlet-name>taskServlet</servlet-name>
<servlet-class>com.bjmobile.TaskServlet</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>
// 这个servlet是执行后台操作,不需要相应外部请求,因此没有必要为它定义servlet-mapping。
// <load-on-startup>1</load-on-startup> 必须设置,容器自动初始化,加载任务;

回复
seanwanxin 2011-04-20
[Quote=引用 2 楼 xing_6 的回复:]

首先要弄清楚servlet通讯和socket通讯的区别, servlet要运行在容器中,向客户端提供某种服务,一般客户端就是指浏览器,客户端与服务器端的通讯是通过http协议来完成,而http协议又是建立在TCP/IP(在这地方socket通讯可以认为是该协议的一种实现)协议基础上, 访问servlet一般建立的是socket短连接。

而ServerSocket 作为socket通讯的服务……
[/Quote]

谢谢。现在是客户端和本地服务器都各有一个SocketServer和Client,而Servlet只是用于和中心服务器交互,接收中心服务器的响应,本地服务器和中心服务器的协议老师已经写好了给了我们,主要要我们联系客户端和本地服务器的双向Socket连接。
现在是准备在Servlet的init方法里面启动SocketServer来侦听客户端传送过来的数据,servlet设置为容器开启时直接初始化。而在doPost方法里面接收到中心服务器的响应后,新建一个SocketClient,向客户端的SocketServer发送数据,用的TCP连接。
现在也是硬着头皮做,不知道行不行,还是谢谢你了~~~~~
回复
xing_6 2011-04-19
首先要弄清楚servlet通讯和socket通讯的区别, servlet要运行在容器中,向客户端提供某种服务,一般客户端就是指浏览器,客户端与服务器端的通讯是通过http协议来完成,而http协议又是建立在TCP/IP(在这地方socket通讯可以认为是该协议的一种实现)协议基础上, 访问servlet一般建立的是socket短连接。

而ServerSocket 作为socket通讯的服务器端套节字一般要长期运行,侦听来自客户端的服务。在你提到的处理过程中,本地服务器使用servlet接收中心服务器的响应,然后再使用socket发送给client,此处socket是如何获取的? 另外没提到本地服务器和中心服务器之间是通讯什么协议通讯的。

该方法可行度不高,实现起来比较麻烦。
回复
安特矮油 2011-04-19
这个还是自己去看看socket的知识吧,帮你顶一个
回复
相关推荐
发帖
Web 开发
创建于2007-09-28

8.0w+

社区成员

Java Web 开发
申请成为版主
帖子事件
创建了帖子
2011-04-19 10:05
社区公告
暂无公告