异构数据集成伺服器Socket监听

该数据源伺服器功能上主要包括两大部份,对外通信和内部数据比照转换。决定先做基于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();}
     }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值