bundle开发----Socket通讯(Client)

本文介绍了一个OSGi框架下的WifiBundle作为客户端的实现方式,包括如何建立Socket连接、发送和接收数据包的过程。通过创建新的线程启动Wifi运行流程,并在停止时释放资源。

   上篇记录了作为Server端bundle的实现,本文看看作为Client端如何实现一个bundle,代码改动的地方很小。

先来看看WifiBundle.java,代码如下(远程服务器地址为:192.168.0.1,端口号为:16384):

    package demo.wifi.bundle;  
      
    import java.io.IOException;    
    import java.net.SocketAddress;  
    import java.net.InetSocketAddress;  
    import java.util.logging.Level;  
    import java.util.logging.Logger;  
    import java.nio.ByteBuffer;  
    import java.nio.channels.SocketChannel;  
    import java.nio.channels.ServerSocketChannel;  
    import org.osgi.framework.BundleContext;  
    import java.nio.channels.NotYetConnectedException;  
      
      
    public class WifiBundle {  
          
        public static BundleContext bc = null;  
        private final static Logger logger = Logger.getLogger(WifiBundle.class.getName());    
        public volatile static SocketChannel socketChannel = null;  
           
        public static ServerSocketChannel serverSocketChannel;  
          
        public static boolean wifiRunningFlag = false;  
        public static boolean wifiConnectionError = false;  
      
        public static class WifiRunable implements  Runnable {    
              
            int totalSize = 0;  
            int leftSize = 0;  
            static String eventTopic = null;  
            int arrayPosition = 0;  
            boolean rtn;  
            ByteBuffer receiveBuffer = ByteBuffer.allocateDirect(1024);  
              
            public void run() {
                try {
                   // Socket connection
                   socketChannel = SocketChannel.open();  
                   SocketAddress socketAddress = new InetSocketAddress("192.168.0.1", 16384);
                
                  
                   if(!socketChannel.connect(socketAddress)) {
                       System.out.println("Wifi connection failed!"); 
                   } else {
                       System.out.println("Wifi connection OK!");
                   }
               
            
                   while (wifiRunningFlag) {  
                       receiveBuffer.clear();  
                       rtn = receivePackage(receiveBuffer, 128);    
                       if(!rtn) {  
                          receiveBuffer.clear();  
                          break;  
                       }  
                       receiveBuffer.clear();    
                       sendPackage(receiveBuffer);                       
                       receiveBuffer.clear();  
                   }  


                
                } catch (Exception ex) {
                    logger.log(Level.SEVERE, null, ex);
        
                }

             finally {
                try {
                    socketChannel.close();
                    socketChannel = null;
                    System.out.println("socketChannle closed!\n");
                } catch(Exception ex) {
                    return;
                }
    
            }
        }
        
    } 
          
      
        public static void sendPackage(ByteBuffer buffer) throws IOException {    
            try {  
                socketChannel.write(buffer);  
            } catch(IOException ex) {  
              ex.printStackTrace();  
              System.out.println("error occured in sendPackage()!");  
              wifiConnectionError = true;  
              return;  
            }  
            return;  
        }  
          
      
        public static boolean receivePackage(ByteBuffer byteBuffer, int size) throws IOException {  
              
            int arrayPos = 0;  
            int tempSize ;  
            int leftSize = size;  
            int totalSize = size;  
            byte[] tempByteArray = new byte[totalSize];   
            ByteBuffer tempBuffer = ByteBuffer.allocateDirect(1);  
              
            while((leftSize > 0) && (wifiRunningFlag == true))  {  
                try {  
                    while(((tempSize = socketChannel.read(tempBuffer)) != -1)  && (wifiRunningFlag == true) ) {       
                        tempBuffer.flip();  
                        if (tempSize == 0) {  
                            continue;  
                        } else {  
                            tempBuffer.get(tempByteArray, arrayPos, tempSize);  
                            leftSize --;  
                            arrayPos ++;  
                            if(leftSize == 0) {  
                                break;  
                            }  
                        }     
                    }     
                  } catch (IOException ex) {  
                    ex.printStackTrace();  
                    System.out.println("error occured in receivePackage()!");  
                    wifiConnectionError = true;  
                    return false;  
                }  
                  
            }  
              
            byteBuffer.put(tempByteArray, 0, size);  
              
            return true;      
        }  
                  
    }     

再来看看Activator.java,代码比较简单,只需在start和stop函数中分别开始和终止socket收发进程。
    package demo.wifi.bundle;  
      
    import org.osgi.framework.BundleActivator;  
    import org.osgi.framework.BundleContext;  
    import demo.wifi.bundle.WifiBundle.WifiRunable;  
    import demo.wifi.bundle.WifiBundle;  
      
      
    public class Activator implements BundleActivator {  
          
      
      public void start(BundleContext context) throws Exception {  
            
          System.out.println("wifi bundle started!");    
          WifiEventPublisher.bc = context;  
          WifiEventPublisher.eventRegister();  
      
            
          //start Wifi new thread  
          new Thread(new WifiRunable()).start();  
          WifiBundle.wifiRunningFlag = true;  
      }  
      
      public void stop(BundleContext context) throws Exception {  
          WifiBundle.wifiRunningFlag = false;  
          WifiEventPublisher.EventUnregister();  
          if(WifiBundle.socketChannel.isConnected()) {  
              WifiBundle.socketChannel.close();  
          }  
          System.out.println("wifi bundle stoped!");  
      }  
    }  


import xml.etree.ElementTree as ET sd_sock_connecion_data = [ ("SD_SCB_ANY", "VLAN_510/SD_SoAddr_ANY", "VLAN_510/SD_pduTr_ANY_VLAN_510_RxPdu", "VLAN_510/SD_SoAddr_Multicast"), ("SD_SCB_ITM_MCU_VLAN_510", "VLAN_510/SD_SoAddr_ANY", "VLAN_510/SD_pduTrECUInterface_ITM_MCU_VLAN_510RxPdu", "VLAN_510/SD_pduTrECUInterface_ITM_MCU_VLAN_510TxPdu", "VLAN_510/SD_SoAddr_ITM_MCU_VLAN_510"), ("SD_SCB_ITM_SOC_VLAN_510", "VLAN_510/SD_SoAddr_ANY", "VLAN_510/SD_pduTrECUInterface_ITM_SOC_VLAN_510RxPdu", "VLAN_510/SD_pduTrECUInterface_ITM_SOC_VLAN_510TxPdu", "VLAN_510/SD_SoAddr_ITM_SOC_VLAN_510") ] python代码,利用上述ecu_net_data生成如下xml内容 <SOCKET-CONNECTION-BUNDLE> <SHORT-NAME>SD_SCB_ANY</SHORT-NAME> <BUNDLED-CONNECTIONS> <SOCKET-CONNECTION> <CLIENT-PORT-REF DEST="SOCKET-ADDRESS">/Topology/Clusters/EthernetCluster16/VLAN_510/SD_SoAddr_ANY</CLIENT-PORT-REF> <PDUS> <SOCKET-CONNECTION-IPDU-IDENTIFIER> <HEADER-ID>4294934784</HEADER-ID> <PDU-TRIGGERING-REF DEST="PDU-TRIGGERING">/Topology/Clusters/EthernetCluster16/VLAN_510/SD_pduTr_ANY_VLAN_510_RxPdu</PDU-TRIGGERING-REF> </SOCKET-CONNECTION-IPDU-IDENTIFIER> </PDUS> </SOCKET-CONNECTION> </BUNDLED-CONNECTIONS> <SERVER-PORT-REF DEST="SOCKET-ADDRESS">/Topology/Clusters/EthernetCluster16/VLAN_510/SD_SoAddr_Multicast</SERVER-PORT-REF> </SOCKET-CONNECTION-BUNDLE> <SOCKET-CONNECTION-BUNDLE> <SHORT-NAME>SD_SCB_ITM_MCU_VLAN_510</SHORT-NAME> <BUNDLED-CONNECTIONS> <SOCKET-CONNECTION> <CLIENT-PORT-REF DEST="SOCKET-ADDRESS">/Topology/Clusters/EthernetCluster16/VLAN_510/SD_SoAddr_ANY</CLIENT-PORT-REF> <PDUS> <SOCKET-CONNECTION-IPDU-IDENTIFIER> <HEADER-ID>4294934784</HEADER-ID> <PDU-TRIGGERING-REF DEST="PDU-TRIGGERING">/Topology/Clusters/EthernetCluster16/VLAN_510/SD_pduTrECUInterface_ITM_MCU_VLAN_510RxPdu</PDU-TRIGGERING-REF> </SOCKET-CONNECTION-IPDU-IDENTIFIER> <SOCKET-CONNECTION-IPDU-IDENTIFIER> <HEADER-ID>4294934784</HEADER-ID> <PDU-TRIGGERING-REF DEST="PDU-TRIGGERING">/Topology/Clusters/EthernetCluster16/VLAN_510/SD_pduTrECUInterface_ITM_MCU_VLAN_510TxPdu</PDU-TRIGGERING-REF> </SOCKET-CONNECTION-IPDU-IDENTIFIER> </PDUS> </SOCKET-CONNECTION> </BUNDLED-CONNECTIONS> <SERVER-PORT-REF DEST="SOCKET-ADDRESS">/Topology/Clusters/EthernetCluster16/VLAN_510/SD_SoAddr_ITM_MCU_VLAN_510</SERVER-PORT-REF> </SOCKET-CONNECTION-BUNDLE> <SOCKET-CONNECTION-BUNDLE> <SHORT-NAME>SD_SCB_ITM_SOC_VLAN_510</SHORT-NAME> <BUNDLED-CONNECTIONS> <SOCKET-CONNECTION> <CLIENT-PORT-REF DEST="SOCKET-ADDRESS">/Topology/Clusters/EthernetCluster16/VLAN_510/SD_SoAddr_ANY</CLIENT-PORT-REF> <PDUS> <SOCKET-CONNECTION-IPDU-IDENTIFIER> <HEADER-ID>4294934784</HEADER-ID> <PDU-TRIGGERING-REF DEST="PDU-TRIGGERING">/Topology/Clusters/EthernetCluster16/VLAN_510/SD_pduTrECUInterface_ITM_SOC_VLAN_510RxPdu</PDU-TRIGGERING-REF> </SOCKET-CONNECTION-IPDU-IDENTIFIER> <SOCKET-CONNECTION-IPDU-IDENTIFIER> <HEADER-ID>4294934784</HEADER-ID> <PDU-TRIGGERING-REF DEST="PDU-TRIGGERING">/Topology/Clusters/EthernetCluster16/VLAN_510/SD_pduTrECUInterface_ITM_SOC_VLAN_510TxPdu</PDU-TRIGGERING-REF> </SOCKET-CONNECTION-IPDU-IDENTIFIER> </PDUS> </SOCKET-CONNECTION> </BUNDLED-CONNECTIONS> <SERVER-PORT-REF DEST="SOCKET-ADDRESS">/Topology/Clusters/EthernetCluster16/VLAN_510/SD_SoAddr_ITM_SOC_VLAN_510</SERVER-PORT-REF> </SOCKET-CONNECTION-BUNDLE>
03-08
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值