最近的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 就可以解决,并不需要其他高深的技术或框架。
分享到:
相关推荐
在IT行业中,构建一个基于Java的Web应用是常见的任务,涉及到客户端与服务器之间的交互、用户界面设计以及数据存储。在这个项目中,“HttpURLConnection + Servlet + Swing 登陆注册 + 留言板”就是一个典型的组合,...
Java通过HttpURLConnection与Servlet通信是Web开发中常见的一种交互方式,尤其在客户端和服务端进行数据交换时。HttpURLConnection是Java标准库中提供的一个类,它允许应用程序作为一个HTTP客户端发起请求并接收响应...
在IT行业中,网络编程是不可或缺的一部分,而HTTP协议作为互联网上的通信标准,其在Java中的实现通常是通过`HttpURLConnection`类。本知识点将深入探讨如何使用`HttpURLConnection`与Servlet协同工作,处理多文件...
5. **Android与Servlet通信**:在Android应用中,可以通过`HttpURLConnection`类或第三方库(如OkHttp)发起HTTP请求,向Servlet发送数据。这些库可以方便地处理连接、编码、解码等工作。 6. **异步处理**:为了...
本例演示最简单的android客户端和服务器端通信,客户端使用android4.0以上版本,服务器端为dynamic web project工程,使用时将client代码中的ip地址改为自己电脑的ipv4地址,同时保证手机和电脑处于同一网络下(内网...
本文将深入探讨Java Applet与Java Servlet之间的安全通信策略及其实现。 1. **Java Applet简介** Java Applet是嵌入在HTML页面中的小型Java程序,由Java虚拟机(JVM)在客户端浏览器中执行。Applet通常用于提供富...
在IT行业中,网络通信是构建分布式系统的基础,而HTTP(超文本传输协议)与Servlet则是其中的重要组成部分。本文将深入探讨HTTP通信以及Servlet接口,并结合Android客户端进行实践讲解。 首先,HTTP是互联网上应用...
在Java编程语言中,HTTPURLConnection是Java标准库提供的一个接口,用于通过HTTP协议与服务器进行通信。这个接口在java.net包下,是处理HTTP请求的基础类,包括发送GET、POST等请求,以及文件上传功能。在本文中,...
本文将详细介绍如何利用HttpURLConnection实现Android应用中的断点续传功能。 首先,理解断点续传的概念。断点续传是指当下载或上传文件过程中因网络问题中断后,可以从上次中断的位置继续进行,而不是重新开始。这...
在Android开发中,有时我们需要将本地的文件...通过理解以上步骤和注意事项,开发者可以有效地利用HttpURLConnection在Android应用中实现代理文件上传功能。同时,了解服务器端如何接收和处理这些文件也是至关重要的。
在Android客户端,我们需要使用HttpURLConnection或OkHttp库来发起HTTP请求,与Servlet进行通信。当用户选择图片后,我们可以通过Intent获取到图片的URI,然后读取图片文件并转换为字节数组。接着,将这些字节数据...
6. Web应用在Tomcat上的部署: - 默认部署目录是`webapps`。 - 访问某个应用的URL格式为:`http://localhost:8080/应用名/资源路径`。 7. HTTP响应: - 包括响应头、响应正文和协议版本号,不包括响应状态行...
5. **使用WebSocket进行双向通信**:如果需要实时通信,如聊天室或游戏应用,`Applet`可以利用WebSocket协议与`Servlet`建立持久连接,实现实时数据交换。 在实际应用中,为了安全性和性能考虑,通常会限制`Applet`...
在本示例中,我们将深入理解Servlet的简单应用,包括其工作原理、创建过程以及如何与客户端进行交互。 首先,Servlet是Java的一个接口,位于javax.servlet包中。开发人员需要实现Servlet接口或继承HttpServlet类来...
在Java中,如果需要从网络上下载文件,`HttpURLConnection`是一个常见的选择,它提供了与HTTP服务器进行通信的能力,包括发送请求、接收响应以及读取返回的数据。在给定的代码片段中,展示了如何使用`...
在Android应用开发中,与服务器进行数据交互是常见的需求,而Servlet是一种在Java Web服务器上运行的组件,常用于处理客户端请求并返回响应。本文将详细介绍Android如何与Servlet进行交互,以及服务器端HTML代码在...
总结来说,Java实现多次HttpURLConnection共享session的关键在于正确处理Cookie,保存服务器返回的Session ID,并在后续请求中携带这个ID。通过这种方式,即使没有浏览器环境,也能模拟登录状态,爬取登录后的内容。...
在Java编程环境中,当需要与Web服务器交互,例如上传文件时,`HttpURLConnection`是一个常见的选择,因为它提供了灵活且高效的方式。本篇文章将详细讲解如何使用`HttpURLConnection`实现文件上传,同时涉及到服务器...
在IT行业中,Android和Servlet之间的交互是移动应用开发中常见的技术组合。Android是谷歌推出的开源移动操作系统,广泛用于智能手机和平板电脑,而Servlet是Java Web编程的重要组成部分,用于构建动态Web服务。本...
1. **Android网络请求库**:在Android应用中,我们通常不直接使用低级的Socket API来实现网络通信,而是选择一些高级的网络库,如`HttpURLConnection`(原生API)、`Volley`、`Retrofit`或`OkHttp`。本示例可能使用...