该数据源伺服器功能上主要包括两大部份,对外通信和内部数据比照转换。决定先做基于TCP的Socket通信,首先要解决的就是监听数据源变动信息。考虑到可能多个数据源同时发起连接,采用多线程设计。由SynchListen线程创建服务器端套接字并同步监听来自数据源的连接,一旦建立Socket连接就由ListenThread线程开始监听接受数据流。
//数据源同步监听SynchListen.java
import java.net.*;
import java.io.*;
public class SynchListen extends Thread
{
private int listenPort=-1; //监听端口
private ServerSocket synchSock=null; //监听服务器套接字
public SynchListen()
{
listenPort = 1300;
//伺服器监听端口,考虑到更方便变换端口,也可以采用资源配置方式
try{
synchSock=new ServerSocket(listenPort); //以给定的端口构造同步监听服务器套接字
GlobalConfig.PrintMessage("同步监听已启动,端口:"+this.listenPort,null,false);
//该方法在全局配置GlobalConfig.java中实现,在控制台或图形界面日志区输出信息
}catch(IOException ex){
GlobalConfig.PrintMessage("同步监听启动失败/n"+ex.getMessage(),null,false);
synchSock=null;}
}
public void run() //重载Thread父类的run()方法,执行SynchListen线程
{
if(synchSock==null) return;
while(true)
{
try{new ListenThread(synchSock.accept()).start();}
//侦听并接受到来自数据源的的Socket连接,返回该连接的客户端套接字给数据流监听线程
catch(IOException ex){ex.printStackTrace();continue;}
}
}
}
//数据流监听线程ListenThread.java
import java.net.*;
import java.io.*;
public class ListenThread extends Thread
{
private Socket client=null; //客户端套接字
private BufferedReader in=null; //缓冲字符输入流
private BufferedWriter out=null; //缓冲字符输出流
public ListenThread(Socket socket)
{
this.client=socket;
GlobalConfig.PrintMessage("connection from "+client.getLocalAddress().getHostAddress(),null,false);
try{
in=new BufferedReader(new InputStreamReader(this.client.getInputStream()));
out=new BufferedWriter(new OutputStreamWriter(this.client.getOutputStream()));
}catch(IOException ex) {in=null;out=null;}
}
public void run() //重载Thread父类的run()方法,执行ListenThread线程
{
if((in==null)||(out==null)) return;
String func=null;
try{
while((func=in.readLine())!=null)
{
System.out.println(func);
//为测试时直观起见,先把监听到的数据流输出到控制台
//监听到此为止。经分析对比后,伺服器将以客户端套接字身份把数据流转发出去
}
}catch(IOException ex) {ex.printStackTrace();}
}
}