最近的web项目(J2ee + Flex)求在多台主机上运行,用的是同一个数据库,实现简单的集群。具体的集群还没实现,但我的啊head要求我实现一个IM(InstantMessage即时信息)功能。这功能不难,难就在于各用户是登录在不用的主机上,要解决不同主机间的通信。
同一应用在不同主机间的通信,我想可以有两种方法:1)用java socket; 2)用http request(其实,http request的底层也是socket连接的,是对socket高层次的封装。)。
考虑到实现上的方便,我就选用了http request来实现通信(原理如下):
先用 java HttpURLConnection 来发送http请求(因为一般的jsp/servlet发送请求时是会转向一个web地址的,这对于IM功能来说是没需要的)。根据各主机的地址,创建不同的 HttpURLConnection 。然后用一个 servlet 来处理请求,并处理相应的 IM 信息。
HttpURLConnection 实现的主要代码:
String[] reqPath;//各主机的请求路径
// 记录各主机的 URL 和相应的 HttpURLConnection
URL[] url;
HttpURLConnection[] httpURLConnection;
......
......
public void sendMessage( String sender, String msg, String receiver) {
try {
msg = URLEncoder.encode(msg, "UTF-8");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
url = new URL[reqPath.length];
httpURLConnection = new HttpURLConnection[reqPath.length];
for (int i = 0; i < reqPath.length; i++) {
String urlPath = reqPath[i] + "?sender="+sender+"&msg=" + msg + "&receiver="
+ receiver;
System.out.println("urlPath: " + urlPath);
try {
url[i] = new URL(urlPath);
httpURLConnection[i] = (HttpURLConnection) url[i]
.openConnection();
System.out.println("url[" + i + "]: " + url[i]);
System.out.println("httpURLConnection[" + i + "]: "
+ httpURLConnection[i]);
httpURLConnection[i].setConnectTimeout(5000);
httpURLConnection[i].setRequestMethod("POST");
httpURLConnection[i].setDoOutput(true);
httpURLConnection[i].setRequestProperty("Content-Type",
"text/html;charset=UTF-8");
httpURLConnection[i].setRequestProperty("Cache-Control",
"no-cache");
httpURLConnection[i].connect();
InputStream is = httpURLConnection[i].getInputStream();
int resCode = httpURLConnection[i].getResponseCode();
System.out.println("ResponseCode:" + resCode);
is.close();
} catch (MalformedURLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
}
}
if (httpURLConnection != null) {
for (int i = 0; i < httpURLConnection.length; i++) {
httpURLConnection[i].disconnect();
}
httpURLConnection = null;
}
if (url != null) {
url = null;
}
}
.........
在测试中,因为所发送的 message 的是有空格,所以构造出来的 URL 也是有空格的。这对IE来说是不允许的(测试中出现了 "Server returned HTTP response code: 505" 的 exception )。所以上边代码中有 "msg = URLEncoder.encode(msg, "UTF-8");" 这一句来处理。而在处理请求的 servlet 中我们可以用 "content = URLDecoder.decode(content,"UTF-8");" 来还原 message。
小结:想实现web简单的集群,HttpURLConnection 与 servlet 就可以解决,并不需要其他高深的技术或框架。
分享到:
相关推荐
HttpURLConnection servlet swing 登陆注册 留言板
本例演示最简单的android客户端和服务器端通信,客户端使用android4.0以上版本,服务器端为dynamic web project工程,使用时将client代码中的ip地址改为自己电脑的ipv4地址,同时保证手机和电脑处于同一网络下(内网...
研究了才搞清楚,其实挺简单的,在这里记录下,以便以后参考。 一、创建一个servlet项目 主要包括(WEB-INF)里面有classes文件夹、lib文件夹、web.xml文件。 将写好的servlet类编译成的.class放到项目中的...
NULL 博文链接:https://dreamoftch.iteye.com/blog/1860289
使用HttpURLConnection实现断点续传
HttpURLConnection文件下载\httpURLConnection文件下载
本示例使用HttpUrlConnection实现上传文件,可以将手机上的文件上传到服务器 必须与my_upload工程配合运行,先启动my_upload工程
Java自带的HttpURLConnection访问接口文件上传, 含普通参数值传递和文件传递
分别使用HttpURLConnection OKHttp实现请求
HttpURLConnection实现三方接口HTTP调用调用,带有FILE文件参数
java实现多次HttpURLConnection共享session,发送两次请求共享同一个session,这样做爬虫的时候就可以爬网站登录后能看到的内容了
CUrl类是以命令行工具CUrl为参考,使用标准Java的HttpURLConnection实现的Http工具类
android与服务器通信上传图片的AndroidStudio程序,自己写的,调用HttpURLConnection方法实现。大创项目的核心上传图片程序。
使用HttpUrlConnection实现上传文件服务器端代码,引用commons-fileupload-1.2.1.jar、commons-io-1.4.jar
tomcat与web程序结构与Http协议与HttpUrlConnection.pdf
HttpURLConnection实现单线程下载 DownLoad, 多线程下载 MutilDownLoad1, 多线程续点下载MutilDownLoad2
"Java 实现利用 HTTP 基于 Servlet 上传文件至服务器" 文件上传概述 文件上传是指客户端将文件传输到服务器端的过程。...通过本文,读者可以了解 Java 实现文件上传的基本原理和方法,并应用于实际开发中。
HttpURLConnection的demo,里面有网络请求get post 上传文件,下载文件,介绍HttpURLConnection这个类整体流程是怎样使用的,方便初学者学习
HttpURLConnection是基于HTTP协议的,其底层通过socket通信实现。如果不设置超时(timeout),在网络异常的情况下,可能会导致程序僵死而不继续往下执行。