某银行要求做一个签到签退功能,日终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时配置丢失,示例内容如下:

  1. <!-- Socket mapping by huangrx 20130101-->
  2. <servlet>
  3.   <servlet-name>xxtServlet</servlet-name>
  4.   <servlet-class>xxt.oracle.apps.gl.chk.server.xxtServlet</servlet-class>
  5.   <load-on-startup></load-on-startup>
  6. </servlet>
  7.  
  8. <servlet-mapping>
  9.   <servlet-name>xxtServlet</servlet-name>
  10.   <url-pattern>/xxtServlet</url-pattern>
  11. </servlet-mapping>

2、 在xxtServlet类的init方法中添加Socket调用,值得注意的是,如果单独在该Servelt的init()方法中编写Server端代码,并进行监听, 会造成Tomcat或其他Web服务器启动超时, 正确的做法应该是单独写一个监听处理线程类,然后在init()中,用多线程的方式来启动该线程:

  1. xxtServlet
  2.  
  3. package xxt.oracle.apps.gl.chk.server;
  4.  
  5. import java.io.IOException;
  6.  
  7. import java.lang.Runnable;
  8. import java.lang.Thread;
  9.  
  10. import javax.servlet.ServletConfig;
  11. import javax.servlet.ServletException;
  12. import javax.servlet.http.HttpServlet;
  13. import javax.servlet.http.HttpServletRequest;
  14. import javax.servlet.http.HttpServletResponse;
  15.  
  16. publicclass xxtServlet extendsHttpServlet
  17. {
  18. privatestaticfinallong serialVersionUID =1L;
  19. private xxtSocketServer socket =null;
  20.  
  21. public xxtServlet()
  22. {
  23. super();
  24. }
  25.  
  26. // Init Method
  27. publicvoid init(ServletConfig config)throwsServletException
  28. {
  29. super.init(config);
  30.  
  31. // 线程调起服务
  32. newThread(newSocketRunnable()).start();
  33. }
  34.  
  35. // Get Method
  36.  
  37. protectedvoid doGet(HttpServletRequest request,
  38. HttpServletResponse response)throwsServletException,
  39. IOException
  40. {
  41. System.out.println("***************ServletServer doGet");
  42. }
  43.  
  44. // Post Method
  45.  
  46. protectedvoid doPost(HttpServletRequest request,
  47. HttpServletResponse response)throwsServletException,
  48. IOException
  49. {
  50. System.out.println("***************ServletServer doPost");
  51. }
  52.  
  53. privateclassSocketRunnableimplementsRunnable
  54. {
  55. publicvoid run()
  56. {
  57. try
  58. {
  59. // xxtSocketServer中处理Socket
  60. socket =new xxtSocketServer();
  61. }catch(IOException e)
  62. {
  63. e.printStackTrace();
  64. }
  65. socket.service();
  66. System.out.println("***************Load on start");
  67. }
  68. }
  69. }
  70.  
  71. xxtSocketServer
  72.  
  73. package xxt.oracle.apps.gl.chk.server;
  74.  
  75. import java.io.BufferedReader;
  76. import java.io.IOException;
  77. import java.io.InputStreamReader;
  78. import java.io.PrintWriter;
  79.  
  80. import java.net.ServerSocket;
  81. import java.net.Socket;
  82.  
  83. import java.util.Properties;
  84. import java.util.concurrent.ExecutorService;
  85. import java.util.concurrent.Executors;
  86.  
  87. publicclass xxtSocketServer
  88. {
  89.  
  90. privateServerSocket serverSocket;
  91. privateExecutorService executorService;
  92. privatefinalint POOL_SIZE =10;
  93.  
  94. privatestaticProperties prop =newProperties();
  95. static{
  96. try
  97. {
  98. prop.load(xxtDBConn.class.getResourceAsStream("config.properties"));
  99. }catch(IOException e)
  100. {
  101. System.out.println("File:config.properties no find,PLS check out!");
  102. e.printStackTrace();
  103. }
  104. }
  105. privatestaticint EBS_PORT =Integer.parseInt(prop.getProperty("ebs_port"));
  106.  
  107. // 报文头5位
  108. publicstaticString getString(String src)
  109. {
  110. while(src.length()<5)
  111. {
  112. src = "0" + src;
  113. }
  114. return src;
  115. }
  116.  
  117. public xxtSocketServer()throwsIOException
  118. {
  119. try
  120. {
  121. serverSocket = newServerSocket(EBS_PORT);
  122. executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()* POOL_SIZE);
  123. }catch(IOException e)
  124. {
  125. e.printStackTrace();
  126. }
  127.  
  128. }
  129.  
  130. publicvoid service()
  131. {
  132. while(true)
  133. {
  134. Socket socket =null;
  135. try
  136. {
  137. socket = serverSocket.accept();
  138. // new Handler(socket);
  139. executorService.execute(newHandler(socket));
  140. }catch(Exception e)
  141. {
  142. e.printStackTrace();
  143. }
  144. }
  145. }
  146.  
  147. /////////////////////////////////////////////////////////
  148. publicstaticvoid main(String[] args)throwsIOException
  149. {
  150. new xxtSocketServer().service();
  151. }
  152.  
  153. privateclassHandlerimplementsRunnable
  154. {
  155.  
  156. privateSocket socket;
  157. privateBufferedReader br =null;
  158. privatePrintWriter pw =null;
  159.  
  160. privateint bit;
  161. privateString endTag ="</of>";
  162.  
  163. /**
  164. * @param socket
  165. */
  166. publicHandler(Socket socket)
  167. {
  168. this.socket = socket;
  169. System.out.println("******************Server Start**********************");
  170.  
  171. }
  172.  
  173. publicvoid run()
  174. {
  175. try
  176. {
  177. /*
  178. * System.out.println("New connection accepted " + socket.getInetAddress() + ":" + socket.getPort());
    * pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
  179. */
  180. br = newBufferedReader(newInputStreamReader(socket.getInputStream()));
  181. pw = newPrintWriter(socket.getOutputStream());
  182.  
  183. String msg ="";
  184. /*
  185. * while ((msg = br.readLine()) != null) {
  186. * System.out.println("Receive From Client:" + msg);
  187. * pw.println(msg);
    * pw.flush();
    * if (msg.length() != msg.replaceAll(endTag, "").length())
    * { break; }
    *}
  188. */
  189. while((bit = br.read())!=-1)
  190. {
  191. char chr =(char)bit;
  192. msg +=String.valueOf(chr);
  193. endTag =(endTag +String.valueOf(chr)).substring(1);
  194. if(endTag !=null&&endTag.equals("</of>"))
  195. {
  196. break;
  197. }
  198. }
  199. String str ="";
  200.  
  201. if(msg.trim()==null|| msg.trim().equals(""))
  202. {
  203. str ="00105<of><checkd></checkd><cnt></cnt><detail><acctno></acctno><onlnbl></onlnbl><blncdn></blncdn></detail></of>";
  204. }
  205. else
  206. {
  207. xxtXMLServer.parseStringXml(msg.trim());
  208. str = xxtXMLServer.createXML(xxtXMLServer.getHashMap());
  209. str = getString(str.length() + "" ) + str;
  210. }
  211. System.out.println("Server Return Xml:"+ str);
  212. pw.write(str);
  213. pw.flush();
  214.  
  215. }catch(Exception e)
  216. {
  217. e.printStackTrace();
  218. }finally
  219. {
  220. try
  221. {
  222. System.out.println("******************Server Close**********************");
  223. if(br !=null)
  224. br.close();
  225. if(pw !=null)
  226. pw.close();
  227. if(socket !=null)
  228. socket.close();
  229. }catch(IOException e)
  230. {
  231. e.printStackTrace();
  232. }
  233. }
  234. }
  235. }
  236. }

由于是初稿,代码没做优化,目前遇到的问题是,在停止应用时要停两次才能结束,还未找到解决方法。
在网络上摘抄另一种多线程调用的方法:

  1. publicvoid init(ServletConfig config){
  2. newThread(){
  3. publicvoid run(){
  4. try{
  5. ServerSocket server =newServerSocket(1234);
  6. Socket socket =null;
  7. while(true){
  8. socket = server.accept();
  9. SocketServer sServer =newSocketServer(socket);
  10. sServer.start();
  11. }
  12. }catch(IOException e){
  13. System.out.println(e.getMessage());
  14. }
  15. }
  16. }.start();
  17. }
  18.  
  19. publicclassSocketServerextendsThread{
  20. privateSocket socket;
  21.  
  22. publicSocketServer(Socket socket){
  23. this.socket = socket;
  24. }
  25.  
  26. publicvoid run(){
  27. String output ="";
  28. try{
  29. BufferedReaderis=newBufferedReader(newInputStreamReader(socket.getInputStream()));
  30. PrintWriter os =newPrintWriter(socket.getOutputStream());
  31. String line =null;
  32. line =is.readLine();
  33. System.out.println(line);
  34. output ="server send";
  35. os.println(output);
  36. os.flush();
  37. is.close();
  38. os.close();
  39. socket.close();
  40. }catch(IOException e){
  41. e.printStackTrace();
  42. }
  43. }
  44. }

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. JS--遍历对象

    var person = { Name:"Frank", Age:23 } Object.keys(person).forEach(function(key){ console.l ...

  2. 如何快速清除ZBrush画布中多余图像

    ZBrush是一款数字雕刻与绘画软件,它以强大的功能和直观的工作流程彻底改变了整个三维行业.它的简洁化.智能化和人性化的设计无不让众多用户所折服.刚接触它的用户可能会因为找不到相关命令或不熟悉而觉得它 ...

  3. BZOJ 1862: [Zjoi2006]GameZ游戏排名系统 [treap hash]

    1862: [Zjoi2006]GameZ游戏排名系统 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1318  Solved: 498[Submit][ ...

  4. 011商城项目:图片服务器的安装---nginx

    这个是电商的项目,不是传统项目,所以给图片单独架一台服务器. 我们看上图: 用户上传图片时上传到Tomcat1或者Tomcat2.然后Tomcat1和Tomcat2通过FTP服务把图片上传到图片服务器 ...

  5. JavaScript的two-sum问题解法

    一个很常见的问题,找出一个数组中和为给定值的两个数的下标.为了简单一般会注明解只有一个之类的. 最容易想到的方法是循环遍历,这里就不说了. 在JS中比较优雅的方式是利用JS的对象作为hash的方式: ...

  6. ubuntu 14.04 desktop装vnc4server

    ubuntu 14.04 desktop上安装vnc4server要装上gnome的一些软件包并修改启动文件~/.vnc/xstartup 问题来源How to make VNC Server wor ...

  7. [LeetCode] H-Index II 求H指数之二

    Follow up for H-Index: What if the citations array is sorted in ascending order? Could you optimize ...

  8. [LeetCode] Department Highest Salary 系里最高薪水

    The Employee table holds all employees. Every employee has an Id, a salary, and there is also a colu ...

  9. [LeetCode] Merge Two Sorted Lists 混合插入有序链表

    Merge two sorted linked lists and return it as a new list. The new list should be made by splicing t ...

  10. WinRAR5.4

    Winrar是一款优秀的压缩解压工具! 免费版   :http://www.winrar.com.cn/                  ###加载启动广告,支持正版 海阔天空:http://pan ...