目录
说明:
操作流程:
1、搭建Socket服务端
2、通过Navicat Premium 编写Socket客户端(连接Oracke11g)
2.1 【其他】→【java】→【新建java】(保存后,右键JavaSource→【维护】→【编译或解析】【没有红色标记即可】)?
3、创建存储过程(【函数】→【新建函数】。保存后,右键过程→【维护】→【编译】【没有红色标记即可】)
??4、右键表名→【设计表】→【选择触发器】
5、添加权限(ctrl+R→cmd→输入sqlplus username/password)
?6、运行Socket服务端,操作表进行测试
说明:
? ? ? ? 通过oracle11g自带JDK1.5发送Socket;1、数据库数据新增触发器→2、在数据新增时触发操作→3、调用存储过程或函数→4、函数调用java程序→5、通过oracle自带JDK运行java程序发送Socket到Socket服务端进行业务处理。
操作流程:
1、搭建Socket服务端
Server.java
/**
* 服务器启动类
*/
public class Server {
public static void main(String[] args) {
new Server().start();
}
public void start(){
ServerSocket server = null;
Socket socket = null;
try {
server = new ServerSocket(60000);
System.out.println("服务器已经开启, 监听端口:" + 60000);
ThreadPoolExecutor pool = new ThreadPoolExecutor(
10,
30,
20,
TimeUnit.SECONDS,
new ArrayBlockingQueue<Runnable>(10),
new ThreadPoolExecutor.DiscardOldestPolicy()
);
while (true) {
socket = server.accept();
pool.execute(new ServerThread(socket,socketService));
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
ServerThread.java
/**
* 服务器线程的作用主要是:
* 1.接收来自客户端的信息
* 2.将接收到的信息解析,并转发给目标客户端
*/
public class ServerThread extends Thread {
private Socket socket;
private Boolean monitor = true;
InputStream input = null;
BufferedReader reader = null;
public ServerThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
/**
* 不断轮询接收发送过来的消息
* 信息的格式:固定编号,信息体
* */
System.out.println("监听客户端 - " + socket.getRemoteSocketAddress() + " -> 机连接成功");
while (monitor) {
// 设置连接超时9秒
socket.setSoTimeout(9000);
input = socket.getInputStream();
reader = new BufferedReader(new InputStreamReader(input));
String s = null;
while ((s = reader.readLine()) != null){
System.out.println(s);
}
}
} catch (IOException e) {
System.out.println("监听客户端 - " + socket.getRemoteSocketAddress() + " -> 关闭");
// e.printStackTrace();
} finally {
try {
socket.close();
input.close();
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
2、通过Navicat Premium 编写Socket客户端(连接Oracke11g)
ClientInsert.java
import java.io.PrintWriter;
import java.net.Socket;
public class ClientInsert {
public static String send(String id) {
try {
Socket socket = new Socket("47.92.71.134", 60000);
PrintWriter pw = new PrintWriter(socket.getOutputStream(), true);
pw.println("测试ID:"+id);
} catch (Exception e) {
e.printStackTrace();
return "defeat:" + e.getMessage();
}
return "ok";
}
public static void main(String[] args) {
send("s");
}
}
2.1 【其他】→【java】→【新建java】(保存后,右键JavaSource→【维护】→【编译或解析】【没有红色标记即可】)
3、创建存储过程(【函数】→【新建函数】。保存后,右键过程→【维护】→【编译】【没有红色标记即可】)
CREATE OR REPLACE PROCEDURE socketRequest(newId IN varchar2)
as language java name
'ClientInsert.send(java.lang.String)';
?4、右键表名→【设计表】→【选择触发器】
BEGIN
socketRequest(:new."id"); END;
保存后,【其他】→【触发器】(查看没有红色标记即可)
5、添加权限(ctrl+R→cmd→输入sqlplus username/password)
sql>exec dbms_java.grant_permission( 'username', 'SYS:java.net.SocketPermission', 'oracle地址:1521', 'listen,resolve' );
sql>commit;
sql>exec dbms_java.grant_permission( 'username', 'SYS:java.net.SocketPermission', 'socket服务端地址:端口号', 'connect,resolve' );
sql>commit;
?
?6、运行Socket服务端,操作表进行测试
?
?
?
|