某银行要求做一个签到签退功能,日终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与外系统通信的更多相关文章

  1. android中利用Socket实现手机客户端与PC端进行通信

    1. 项目截图

  2. 在c#中利用keep-alive处理socket网络异常断开的方法

    本文摘自 http://www.z6688.com/info/57987-1.htm 最近我负责一个IM项目的开发,服务端和客户端采用TCP协议连接.服务端采用C#开发,客户端采用Delphi开发.在 ...

  3. [原创]MYSQL中利用外键实现级联删除和更新

    MySQL中利用外键实现级联删除.更新 MySQL支持外键的存储引擎只有InnoDB,在创建外键的时候,要求父表必须有对应的索引,子表在创建外键的时候也会自动创建对应的索引.在创建索引的时候,可以指定 ...

  4. 浅谈JAVA中如何利用socket进行网络编程(二)

    转自:http://developer.51cto.com/art/201106/268386.htm Socket是网络上运行的两个程序间双向通讯的一端,它既可以接受请求,也可以发送请求,利用它可以 ...

  5. 浅谈JAVA中如何利用socket进行网络编程(一)

    转自:http://developer.51cto.com/art/201106/268385.htm Socket是网络上运行的两个程序间双向通讯的一端,它既可以接受请求,也可以发送请求,利用它可以 ...

  6. 利用socket.io+nodejs打造简单聊天室

    代码地址如下:http://www.demodashi.com/demo/11579.html 界面展示: 首先展示demo的结果界面,只是简单消息的发送和接收,包括发送文字和发送图片. ws说明: ...

  7. php 利用socket发送GET,POST请求

    作为php程序员一定会接触http协议,也只有深入了解http协议,编程水平才会更进一步.最近我一直在学习php的关于http的编程,许多东西恍然大悟,受益匪浅.希望分享给大家.本文需要有一定http ...

  8. WPF中利用DynamicDataDisplay快速实现示波器功能

    DynamicDataDisplay控件是一个功能很强的绘图工具,除了能生成曲线外,还有很多其他功能,具体见http://dynamicdatadisplay.codeplex.com/.这里你也能下 ...

  9. C++ 利用socket实现TCP,UDP网络通讯

    学习孙鑫老师的vc++深入浅出,有一段时间了,第一次接触socket说实话有点儿看不懂,第一次基本上是看他说一句我写一句完成的,第二次在看SOCKET多少有点儿感觉了,接下来我把利用SOCKET完成T ...

随机推荐

  1. [译]RxJS 5.X基础篇

    欢迎指错与讨论 : ) 当前RxJS版本:5.0.0-beta.10.更详细的内容尽在RxJS官网http://reactivex.io/rxjs/manual/overview.html.文章比较长 ...

  2. SpringMVC(五) RequestMapping 请求参数和请求头

    可以通过在@RequestMapping的params参数中设置可以传入的参数,且支持简单的表达式,如以下格式: @RequestMapping(value="helloRWorld&quo ...

  3. Ubuntu16.04下安装VS Code

    在Ubuntu下面安装Visual Studio Code sudo add-apt-repository ppa:ubuntu-desktop/ubuntu-make sudo apt-get up ...

  4. [LeetCode] Super Ugly Number 超级丑陋数

    Write a program to find the nth super ugly number. Super ugly numbers are positive numbers whose all ...

  5. 分分钟带你玩转 Web Services

    当大型需求被数个公司分割开来,各公司系统相互交换数据的问题就会接踵而来. 毕竟是多家不同的公司的产品,研发开发语言.采用技术框架基本上是百花齐放. 怎样让自家系统提供的服务具有跨平台.跨语言.跨各种防 ...

  6. 51Nod 1428 活动安排问题

    51Nod   1428  活动安排问题 Link: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1428 1428 活 ...

  7. 1226关于count(*)不走主键索引反而走二级索引

    转自 http://www.2cto.com/database/201508/433975.html mysqlcount(*)会选哪个索引? 2015-08-19      0个评论    来源:D ...

  8. 比较.NET程序集(DLL或EXE)是否相同

    如何比较两个.NET程序集(DLL或EXE)是否相同呢? 直接比较文件内容?当然没那么简单了,这个你可以去试试,去比较一下两次Build产生的程序集, 就算内容没有改变,产生的程序集的二进制文件也是不 ...

  9. 获取文件mime类型

    检测文件类型 finfo_file (PHP >= 5.3.0, PECL fileinfo >= 0.1.0) 修改php.ini,将extension=php_fileinfo.dll ...

  10. BZOJ 后缀自动机四·重复旋律7

    后缀自动机四·重复旋律7 时间限制:15000ms 单点时限:3000ms 内存限制:512MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一段音乐旋律可以被表示为一段数构成的数列. 神奇的 ...