回调函数的实现步骤
- 回调函数就是由客户端自己决定回调函数要实现的功能。(决定权交给了客户端)比如:OnTimer()定时器的回调函数,时间到了,需要做什么,交给客户端自己处理,想添加任何功能都行。
- 利用回调函数实现服务器端与客户端的交流、异步通信。
- 回调函数一般用于截获消息、获取系统信息或处理异步事件。
回调函数的实现步骤
- Server定义接口--------->服务器端需要先制定一个接口,制定服务端需要的各种参数。
- Server设定回调条件----->服务器端设定调用回调函数的条件,制定注册函数。
- Client实现接口---------->客户端实现服务器端制定的接口
- Client注册-------------->即:向服务器端传递参数,也是告知服务器端自己的某种需求。
回调函数实例
服务器端制定的接口
/**
* 服务器端定义的一个接口,
* 通过该接口服务器可以将数据传递给实现该接口的客户端
* @author java_han
*
*/
public interface ICallBack {
void doSomething(String st);
}
服务端程序
import java.util.Scanner;
/**
* 该类相当于一个服务器端程序,
* 给注册过的客户端UI,
* 动态的返回需要更新的数据。
* @author java_han
*
*/
public class DataSource extends Thread {
static ICallBack ic;
// 给回调函数注册一个空的对象
public DataSource() {
ic = new ICallBack() {
@Override
public void doSomething(String st) {
}
};
}
// 根据设定的条件给注册的过的客户端返回字符串数据
@Override
public void run() {
Scanner sc = new Scanner(System.in);
String st;
while ((st = sc.nextLine()) != null) {
ic.doSomething(st);
System.out.println(st);
}
}
// 客户端的注册函数
public void setICallBack(ICallBack ic) {
this.ic = ic;
}
}
客户端程序
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
/**
* 利用回调函数实现异步更新数据
*
* 此类相当于一个客户端程序;
* 实现了服务器端制定的接口,
* 然后向服务器端注册,
* 才能动态的获取服务器端返回的数据。
* @author java_han
*
*/
public class UI extends JFrame implements ICallBack {
static UI ui;
String s = "";
public static void main(String[] args) {
ui = new UI();
ui.setBounds(100, 100, 400, 300);
ui.setDefaultCloseOperation(EXIT_ON_CLOSE);
ui.setVisible(true);
//启动服务器端程序,并向服务器端注册。
DataSource t = new DataSource();
t.setICallBack(ui);
t.start();
}
//客户端自己定义回调函数的实现内容
//此处是将服务端返回的数据显示在UI的textArea中。
public void ChangeText(String st) {
JPanel p = new JPanel();
p.setLayout(null);
p.setBounds(100, 100, 500, 300);
// p.setBackground(Color.red);
JScrollPane jsp = new JScrollPane();
jsp.setBounds(20, 20, 300, 100);
JTextArea jta = new JTextArea();
jta.setBounds(20, 20, 300, 100);
jta.setLineWrap(true);
jsp.add(jta);
st = s + " " + st;
jta.setText(st);
s = jta.getText();
p.add(jta);
ui.setContentPane(p);
ui.setVisible(true);
ui.validate();
}
@Override
public void doSomething(String st) {
// TODO Auto-generated method stub
ChangeText(st);
}
}