EBS中利用Socket与外系统通信
某银行要求做一个签到签退功能,日终EBS系统发送报文与核心系统对帐,规定利用Socket来做传送,记录下步骤:
1、编辑:
$INST_TOP/ora/10.1.3/j2ee/oacore/application-deployments/oacore/html/orion-web.xml
($ORA_CONFIG_HOME/10.1.3/j2ee/oacore/application-deployments/oacore/html/orion-web.xml)
添加Servlet映射,同时需要编辑:$FND_TOP/admin/template/orion_web_xml_1013.tmp这个配套的模板, 以避免做autocfg时配置丢失,示例内容如下:
<!-- Socket mapping by huangrx 20130101-->
<servlet>
<servlet-name>xxtServlet</servlet-name>
<servlet-class>xxt.oracle.apps.gl.chk.server.xxtServlet</servlet-class>
<load-on-startup></load-on-startup>
</servlet> <servlet-mapping>
<servlet-name>xxtServlet</servlet-name>
<url-pattern>/xxtServlet</url-pattern>
</servlet-mapping>
2、 在xxtServlet类的init方法中添加Socket调用,值得注意的是,如果单独在该Servelt的init()方法中编写Server端代码,并进行监听, 会造成Tomcat或其他Web服务器启动超时, 正确的做法应该是单独写一个监听处理线程类,然后在init()中,用多线程的方式来启动该线程:
xxtServlet package xxt.oracle.apps.gl.chk.server; import java.io.IOException; import java.lang.Runnable;
import java.lang.Thread; import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; publicclass xxtServlet extendsHttpServlet
{
privatestaticfinallong serialVersionUID =1L;
private xxtSocketServer socket =null; public xxtServlet()
{
super();
} // Init Method
publicvoid init(ServletConfig config)throwsServletException
{
super.init(config); // 线程调起服务
newThread(newSocketRunnable()).start();
} // Get Method protectedvoid doGet(HttpServletRequest request,
HttpServletResponse response)throwsServletException,
IOException
{
System.out.println("***************ServletServer doGet");
} // Post Method protectedvoid doPost(HttpServletRequest request,
HttpServletResponse response)throwsServletException,
IOException
{
System.out.println("***************ServletServer doPost");
} privateclassSocketRunnableimplementsRunnable
{
publicvoid run()
{
try
{
// xxtSocketServer中处理Socket
socket =new xxtSocketServer();
}catch(IOException e)
{
e.printStackTrace();
}
socket.service();
System.out.println("***************Load on start");
}
}
} xxtSocketServer package xxt.oracle.apps.gl.chk.server; import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter; import java.net.ServerSocket;
import java.net.Socket; import java.util.Properties;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; publicclass xxtSocketServer
{ privateServerSocket serverSocket;
privateExecutorService executorService;
privatefinalint POOL_SIZE =10; privatestaticProperties prop =newProperties();
static{
try
{
prop.load(xxtDBConn.class.getResourceAsStream("config.properties"));
}catch(IOException e)
{
System.out.println("File:config.properties no find,PLS check out!");
e.printStackTrace();
}
}
privatestaticint EBS_PORT =Integer.parseInt(prop.getProperty("ebs_port")); // 报文头5位
publicstaticString getString(String src)
{
while(src.length()<5)
{
src = "0" + src;
}
return src;
} public xxtSocketServer()throwsIOException
{
try
{
serverSocket = newServerSocket(EBS_PORT);
executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()* POOL_SIZE);
}catch(IOException e)
{
e.printStackTrace();
} } publicvoid service()
{
while(true)
{
Socket socket =null;
try
{
socket = serverSocket.accept();
// new Handler(socket);
executorService.execute(newHandler(socket));
}catch(Exception e)
{
e.printStackTrace();
}
}
} /////////////////////////////////////////////////////////
publicstaticvoid main(String[] args)throwsIOException
{
new xxtSocketServer().service();
} privateclassHandlerimplementsRunnable
{ privateSocket socket;
privateBufferedReader br =null;
privatePrintWriter pw =null; privateint bit;
privateString endTag ="</of>"; /**
* @param socket
*/
publicHandler(Socket socket)
{
this.socket = socket;
System.out.println("******************Server Start**********************"); } publicvoid run()
{
try
{
/*
* System.out.println("New connection accepted " + socket.getInetAddress() + ":" + socket.getPort());
* pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
*/
br = newBufferedReader(newInputStreamReader(socket.getInputStream()));
pw = newPrintWriter(socket.getOutputStream()); String msg ="";
/*
* while ((msg = br.readLine()) != null) {
* System.out.println("Receive From Client:" + msg);
* pw.println(msg);
* pw.flush();
* if (msg.length() != msg.replaceAll(endTag, "").length())
* { break; }
*}
*/
while((bit = br.read())!=-1)
{
char chr =(char)bit;
msg +=String.valueOf(chr);
endTag =(endTag +String.valueOf(chr)).substring(1);
if(endTag !=null&&endTag.equals("</of>"))
{
break;
}
}
String str =""; if(msg.trim()==null|| msg.trim().equals(""))
{
str ="00105<of><checkd></checkd><cnt></cnt><detail><acctno></acctno><onlnbl></onlnbl><blncdn></blncdn></detail></of>";
}
else
{
xxtXMLServer.parseStringXml(msg.trim());
str = xxtXMLServer.createXML(xxtXMLServer.getHashMap());
str = getString(str.length() + "" ) + str;
}
System.out.println("Server Return Xml:"+ str);
pw.write(str);
pw.flush(); }catch(Exception e)
{
e.printStackTrace();
}finally
{
try
{
System.out.println("******************Server Close**********************");
if(br !=null)
br.close();
if(pw !=null)
pw.close();
if(socket !=null)
socket.close();
}catch(IOException e)
{
e.printStackTrace();
}
}
}
}
}
由于是初稿,代码没做优化,目前遇到的问题是,在停止应用时要停两次才能结束,还未找到解决方法。
在网络上摘抄另一种多线程调用的方法:
publicvoid init(ServletConfig config){
newThread(){
publicvoid run(){
try{
ServerSocket server =newServerSocket(1234);
Socket socket =null;
while(true){
socket = server.accept();
SocketServer sServer =newSocketServer(socket);
sServer.start();
}
}catch(IOException e){
System.out.println(e.getMessage());
}
}
}.start();
} publicclassSocketServerextendsThread{
privateSocket socket; publicSocketServer(Socket socket){
this.socket = socket;
} publicvoid run(){
String output ="";
try{
BufferedReaderis=newBufferedReader(newInputStreamReader(socket.getInputStream()));
PrintWriter os =newPrintWriter(socket.getOutputStream());
String line =null;
line =is.readLine();
System.out.println(line);
output ="server send";
os.println(output);
os.flush();
is.close();
os.close();
socket.close();
}catch(IOException e){
e.printStackTrace();
}
}
}
R12中System.out的信息及抛出的异常信息可查看:
$LOG_HOME/ora/10.1.3/opmn/oacore_default_group_1中的oacorestd.err和oacorestd.out这两个文件以更精确定位,当然也可以用log4j或自定义类来捕捉。
另外,由于核心系统是用C语言开发,在Java SocketServer端不使用字节来read而使用br.readline()时,就直接卡住了,一种解决方法是在Client端发送的数据后面加上chr(13).chr(10)表示先回车再换行,将其转换成java能够识别的格式就没有问题了。
EBS中利用Socket与外系统通信的更多相关文章
- android中利用Socket实现手机客户端与PC端进行通信
1. 项目截图
- 在c#中利用keep-alive处理socket网络异常断开的方法
本文摘自 http://www.z6688.com/info/57987-1.htm 最近我负责一个IM项目的开发,服务端和客户端采用TCP协议连接.服务端采用C#开发,客户端采用Delphi开发.在 ...
- [原创]MYSQL中利用外键实现级联删除和更新
MySQL中利用外键实现级联删除.更新 MySQL支持外键的存储引擎只有InnoDB,在创建外键的时候,要求父表必须有对应的索引,子表在创建外键的时候也会自动创建对应的索引.在创建索引的时候,可以指定 ...
- 浅谈JAVA中如何利用socket进行网络编程(二)
转自:http://developer.51cto.com/art/201106/268386.htm Socket是网络上运行的两个程序间双向通讯的一端,它既可以接受请求,也可以发送请求,利用它可以 ...
- 浅谈JAVA中如何利用socket进行网络编程(一)
转自:http://developer.51cto.com/art/201106/268385.htm Socket是网络上运行的两个程序间双向通讯的一端,它既可以接受请求,也可以发送请求,利用它可以 ...
- 利用socket.io+nodejs打造简单聊天室
代码地址如下:http://www.demodashi.com/demo/11579.html 界面展示: 首先展示demo的结果界面,只是简单消息的发送和接收,包括发送文字和发送图片. ws说明: ...
- php 利用socket发送GET,POST请求
作为php程序员一定会接触http协议,也只有深入了解http协议,编程水平才会更进一步.最近我一直在学习php的关于http的编程,许多东西恍然大悟,受益匪浅.希望分享给大家.本文需要有一定http ...
- WPF中利用DynamicDataDisplay快速实现示波器功能
DynamicDataDisplay控件是一个功能很强的绘图工具,除了能生成曲线外,还有很多其他功能,具体见http://dynamicdatadisplay.codeplex.com/.这里你也能下 ...
- C++ 利用socket实现TCP,UDP网络通讯
学习孙鑫老师的vc++深入浅出,有一段时间了,第一次接触socket说实话有点儿看不懂,第一次基本上是看他说一句我写一句完成的,第二次在看SOCKET多少有点儿感觉了,接下来我把利用SOCKET完成T ...
随机推荐
- everything + autohotkey的配合使用
一,everything是文件搜索神奇,瞬间定位到文件,在众多的文件中找到你需要的文件.(百度下载就好,分32位和64位) 二,autohotkey是热键启动设置,方便的打开常用的应用. 直接使用 ...
- 如何用fiddler对ios抓包
fiddler端设置:(配置好重启fiddler) 1.首先下载安装fiddler,我安装的是fiddler4 2.Tools->Telerik Fiddler Options->HTTP ...
- c#根据绝对路径获取 带后缀文件名、后缀名、文件名
zz C#根据绝对路径获取 带后缀文件名.后缀名.文件名 1.c#根据绝对路径获取 带后缀文件名.后缀名.文件名. string str =" F:\test\Default.aspx& ...
- HTML5使用jplayer播放音频、视频
首先推上神器 jPlayer:基于HTML5/Flash的音频.视频播放器 jPlayer是一个JavaScript写的完全免费和开源 (MIT) 的jQuery多媒体库插件 (现在也是一个Zepto ...
- [LeetCode] Meeting Rooms 会议室
Given an array of meeting time intervals consisting of start and end times [[s1,e1],[s2,e2],...] (si ...
- 基于C/S架构的3D对战网络游戏C++框架_【不定期更新通知】
由于笔者最近有比赛项目要赶,这个基于C/S架构的3D对战网络游戏C++框架也遇到了一点瓶颈需要点时间沉淀,所以近一段时间不能保证每天更新了,会保持不定期更新.同时近期笔者也会多分享一些已经做过学过的C ...
- string常用函数
1.addslashes($str); //转义时str中的所有特殊字符 stripslashes($str) //还原 2.bin2hex($str); //将2进制转成16进制 3. echo c ...
- js兼容性
1.getElementByClassName 在使用原生JavaScript时,获取类选择符时,即使用getElementByClassName,它在Firefox和IE下是不能兼容. Firefo ...
- 命令行工具aspnet_regiis.exe实现加密和解密web.config
命令行工具aspnet_regiis.exe,是一个类似于DOS的命令工具,称之为命令解释器.使用命令行工具加密和解密web.config文件中的数据库连接字符串时,只需要简单的语法命令即可. 加密语 ...
- matlab中pcolorh函数作用
就是说X,Y是用来定位的,C是用来填充颜色的.参数C要求至少是一个矩阵,而参数X,Y可以是向量,也可以是矩阵.当X,Y是向量时,X与C的行对应,Y与C的列对应,因此向量X与Y的维数必须要求与C的行与列 ...