HTTP 通信问题
HTTP 通信在每种 Web 应用程序中都非常普遍。每当调用某个 Servlet 或 JavaServer Pages (JSP),就会发生 HTTP 通信。虽然 HTTP 协议是平台无关的,但是在不同平台之间通信时需要注意一些特殊的事项。
在本场景中,一个客户端对网关发起一个特殊请求,网关处理该请求,然后向客户端发回一个响应。该客户端使用基于 XML 的专有协议来与网关通信,并且网关仅处理遵守该协议的消息。该协议在 <Name> 和 <Greeting> 这两个 XML 元素之间需要一个换行符。
如清单 1 中的代码所示,该请求的正文添加了一个换行符。但是,服务器是否顺利地处理它并正确地响应呢?视情况而定。这是在跨不同平台移植 Java 应用程序时的一个常见问题。
清单 1. 客户端发出一个 HTTP 请求
try {
URL url = new URL("http://localhost:9081/SampleWeb/Simulator");
URLConnection conn = url.openConnection();
conn.setDoOutput(true);
conn.setRequestProperty("Content-Type", "application/xml");
OutputStream os = conn.getOutputStream();
PrintWriter writer = new PrintWriter(os);
writer.println("<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>");
writer.println("<Name>");
writer.print("<first name>");
writer.print(“Rachel");
writer.println("</first name>");
writer.println("</Name>");
//A line break is required here
writer.println();
writer.println("<Greeting>");
writer.println("Hello!");
writer.println("</Greeting>");
writer.flush();
conn.getInputStream();
} catch (MalformedURLException mue) {
System.err.println("error, message =" + mue);
} catch (IOException ioe) {
System.err.println("error, message =" + ioe);
}
陷阱
该代码在 Windows 上的开发环境中工作得很好,但是在部署到 AIX 上的生产环境中以后,您会惊奇地发现网关没有返回任何响应。那么这段似乎正确的代码出了什么问题呢?
不在您的控制之内的网关是一个运行于 Windows 平台上的 C 程序。它错误地假设所有接收到的请求都来自 Windows,并且 \r\n 换行符应该位于 <Name> 和 <Greeting> 元素之间。因此,它尝试将该请求分析为在 <Name> 和 <Greeting> 之间具有一个 \r\n 字符。然而,在 AIX 和大多数类 UNIX 平台上,如果没有预先设置 line.separator Java 系统属性变量,则其缺省值为 \n,这就是网关抱怨请求格式不正确的原因。
解决办法
一旦您知道了出错的原因,解决此问题是相当简单的。可以在客户端或网关代码中进行修复。
如果您无法控制网关代码,则只能使用 “System.setProperty(“line.separator", "\r\n")" ; 对客户端进行硬编码。
否则,应该让网关代码以适当的方式处理不同的平台。对于类 UNIX 平台,可以将 \n 字符处理为换行符。对于 Mac OS,应该将 \r 处理为换行符。在 Windows 平台上,应该将 \r\n 处理为换行符。
提醒
要注意 Java 应用程序编程接口 (API),例如 java.io.Writer、java.io.Reader 和继承它们的 API。它们全都是基于字符的 API,并且在没有设置行分隔符时,它们将从系统属性获得缺省行分隔符值。如果不需要严格的字符格式,您应该考虑使用基于字节的 Java API 以实现更好的性能。
当在不同平台之间移植时,硬编码平台相关的内容通常是 Java 应用程序失去兼容性的原因之一。行分隔符只是最常见的常量之一。可能的内容还包括文件分隔符、路径分隔符,等等。当您希望在代码中包括这些常量时,应该使用 System.getProperty("property name") 来获得属性值而不是硬编码该字符。
分享到:
相关推荐
东方通Web应用迁移工具是专门为Web应用程序设计的迁移工具,该工具能够将Web应用程序从一个Web服务器迁移到另一个Web服务器上。该工具支持多种Web服务器平台,包括Windows、Linux、Unix等。 东方通Web应用迁移工具...
DB2数据库系统是一款由IBM...总的来说,从AIX到Windows的DB2迁移是一项复杂的工作,涉及到数据库备份恢复、操作系统环境配置、应用程序迁移等多个方面。正确执行每一步,确保数据安全和业务连续性是整个过程的核心。
2. **大小端问题**:在不同架构之间迁移时,如从PowerPC、SPARC迁移到x86、FT1500A,需要考虑字节序的影响,特别是在位操作、寄存器操作以及跨平台网络通信中。 3. **C++11的支持**:支持`auto`、`nullptr`等关键字...
在将Window上的Tomcat项目迁移到Linux系统时,主要涉及以下几个关键步骤: 1. **JDK的配置**: - 首先,需要从Oracle官网(现在是 AdoptOpenJDK 或 Amazon Corretto 等提供者)下载适用于Linux平台的JDK。确保下载...
本案例涉及将运行在AIX服务器上的DB2数据库迁移到Linux环境。以下是整个迁移过程中涉及的关键知识点: 1. **DB2LOOK工具**: `db2look` 是一个用于提取DB2数据库对象定义的实用工具。在这个场景中,它用于获取`...
然而,在特定情况下,可能需要将RAC环境从一个操作系统迁移到另一个。本篇文章将详细介绍如何将基于Symantec存储管理技术的Oracle RAC从HP-UX平台平滑迁移到IBM AIX平台。 1. 环境背景与迁移需求 河南移动的经分A库...
但如果涉及不同的操作系统(如从AIX到Linux),则至少需要Oracle 10g数据库版本以处理字节序差异和其他兼容性问题。 4. 字典管理和本地管理的表空间:被传输的表空间可以是字典管理或本地管理的,且自Oracle 9i起,...
在Java开发过程中,将项目部署到Windows服务器上通常需要配置JDK环境、设置系统路径、配置服务器环境等繁琐步骤。然而,通过特定的技术和工具,我们可以实现Java项目的Windows环境一键部署,大大简化了运维工作。...
Oracle数据库的跨平台迁移是一项技术性较强的工作,尤其是从Linux迁移到Windows。在本案例中,用户成功地将一个在Linux环境下运行的Oracle 10g数据库移植到了Windows操作系统上。以下是对这个过程的详细解释和扩展:...
本文将详细介绍从AIX平台到K-UX平台进行CC++应用迁移的工具和技术知识。 首先,迁移工具是关键。"一种从AIX平台至K-UX平台的CC++应用迁移工具.pdf"可能是该迁移过程的指南或手册,它可能包含以下内容: 1. **源...
本文主要讨论了在异构平台之间迁移数据库的过程,特别是从AIX平台迁移到Linux环境下的实践,并且特别强调了使用RMAN工具的重要性。接下来,我将详细阐释文中的关键知识点。 1. 异构平台下传输表空间的实施 在异构...
Java 项目从 Tomcat 迁移到 JBoss 的解决方案 在 Java 项目中,迁移到 JBoss 可能会出现各种问题,例如版本兼容问题、设置问题等。本文将介绍如何解决这些问题,包括如何配置 JBoss,使得 Spring 项目能够正常运行...
总之,从Windows Server 2008到Windows Server 2016的域迁移是一项涉及多方面的工作,需要周密的计划、详尽的测试和严谨的执行。遵循本手册的指导,可以最大程度地减少中断,确保业务的平稳过渡。
【标题】:“Tomcat与Java Web开发”是一个广泛的话题,涉及到使用Apache Tomcat服务器来部署和运行基于Java的Web应用程序。Tomcat是一个开源的、轻量级的应用服务器,主要用于执行Servlet和JavaServer Pages (JSP)...
- **系统迁移**:将现有系统从旧平台迁移到新平台,可能涉及物理到虚拟化环境的变化。 - **应用程序迁移**:迁移完成后,需重新安装并配置应用程序。 - **验证测试**:迁移完成后进行全面的功能验证测试,确保一切...
- **评估迁移需求**: 确定迁移的目标平台(例如从较旧版本迁移到 AIX 7.1),评估现有应用程序的兼容性。 - **规划迁移步骤**: 根据评估结果制定详细的迁移计划,包括迁移时间表、测试计划等。 - **执行迁移**: 使用...
本文件"一种从AIX平台向K-UX平台迁移的DB2数据库迁移工具.zip"提供了详细指南,帮助用户将DB2数据库从IBM的AIX(Advanced Interactive eXecutive)操作系统迁移到K-UX(Kodak Unix),这是一种基于UNIX的系统。...
- **物理迁移**:若从旧硬件迁移到新硬件,可能需要重新安装系统,再恢复备份的数据。 - **虚拟化迁移**:使用虚拟化技术如PowerVM,可以实现无中断的系统迁移。 ##### 4. **数据与配置恢复** - 将备份的数据...