⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 readsendqueue.java~38~

📁 用java写编写的一个GPS源代码请大家多多指教
💻 JAVA~38~
字号:
package com.gps.center.dataservice;

import java.io.File;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import com.gps.center.baseclass.ParseData;
import com.gps.center.baseclass.MsgObj;
import com.gps.center.baseclass.HashObj;
import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel;
import java.io.*;
import java.net.DatagramPacket;
import com.gps.center.parsedata.SMSClient;
import com.gps.center.dataservice.DbServer;

public class ReadSendQueue extends ParseData implements Runnable {
  private String mServer;
  private int mPort;
  public DbServer db;
  public ReadSendQueue() {
    db = new DbServer();
    System.out.println(db.toString().trim() + "创建DBSERVER对象ReadSendQueue");
   readxml();

  }

  public void run() {
      while (super.openservice) {
          while (super.sendQueue.isEmpty()) {
              try {
                  Thread.sleep(500);
              } catch (InterruptedException e) {
                  System.out.println(e);
              }
          }
          if (!super.sendQueue.isEmpty()) {
              MsgObj msg = getSendMsg();
              //cMsgtype:1--TCPMSG,2--DEVICEUDPMSG,3--SMSMSG
              //4--TCPSENDTODEVICE,5--UDPSENDTODEVICE,6--SMSSENDTODEVICE,7--TCPSENDTOTERMINAL,
              //8--TCPRETURNTERMINAL,9--SENDTODBSERVER
              System.out.println("将发送" + msg.cMsgType + "消息:" + msg.cMsg +
                                 "ReadSendQueue");
              switch (msg.cMsgType) {
              case TCPSENDTODEVICE:
                  tcpSendtoDevice(msg);
                  break;
              case UDPSENDTODEVICE:
                  udpSendtoDevice(msg);
                  break;
              case SMSSENDTODEVICE:
                  smsSendtoDevice(msg);
                  break;
              case TCPSENDTOTERMINAL:
                  tcpSendtoTerminal(msg);
                  break;
              case TCPRETURNTERMINAL:
                  TcpReturnTerminal(msg);
                  break;
              case SENDTODBSERVER:
                  SendToDbServer(msg);
                  break;
              }
          }
      }
  }

  private void TcpReturnTerminal(MsgObj msg) {
    boolean sendOver = false;
    while (!sendOver) {
      //发送
      ByteBuffer buffer = ByteBuffer.allocate(512);
      buffer = ByteBuffer.wrap(msg.cMsg.getBytes());
      SocketChannel TerminalSocket = (SocketChannel) msg.cSelectionKey.
          channel();
      if (msg.cSelectionKey.isValid()) {
        if (msg.cSelectionKey.isWritable()) {
          try {
            TerminalSocket.write(buffer);
            sendOver = true;
          }
          catch (IOException ex) {
            System.err.println("terminalSocket.write(buffer) err");
            System.err.println(ex);
          }
        }
      }
    }

  }

  private void tcpSendtoDevice(MsgObj msg) {
    boolean sendOver = false;
    while (!sendOver) {
      if (super.centerMap.containsKey(msg.cDeviceID)) {
        HashObj hashobj = (HashObj)super.centerMap.get(msg.cDeviceID);
        if (hashobj.cDeviceTcpUsed) {

          ByteBuffer buffer = ByteBuffer.allocate(512);//分派一个512字节数组缓存
          buffer = ByteBuffer.wrap(msg.cMsg.getBytes());//返回一个长度为getBytes()字节数组
          if (hashobj.cDeviceKey.isValid()) {
            SocketChannel DeviceSocket = (SocketChannel) hashobj.cDeviceKey.channel();

            if (hashobj.cDeviceKey.isWritable()) {
              try {
                DeviceSocket.write(buffer);//把 分派512的字节数组缓存 写到SocketChannel中去
                sendOver = true;
              }
              catch (IOException ex) {
                System.err.println("terminalSocket.write(buffer) err");
                System.err.println(ex);
              }
            }
          }
        }
        else {
          sendOver = true;
        }

      }
    }
  }

  private void udpSendtoDevice(MsgObj msg) {
    boolean sendOver = false;
    while (!sendOver) {
      if (super.centerMap.containsKey(msg.cDeviceID)) {
        HashObj hashobj = (HashObj)super.centerMap.get(msg.cDeviceID);
        if (hashobj.cDeviceUdpUsed) {
          //发送
          byte[] buffer = new byte[512];
          buffer = msg.cMsg.getBytes();
          //构造一个发送指定buffer.length长度数据包到指定的端口cDevicePort
          DatagramPacket dp = new DatagramPacket(buffer, buffer.length,hashobj.cDeviceAdd,
                                                                     hashobj.cDevicePort);
          try {
            sendOver = true;
            hashobj.cUdpSocket.send(dp);
          }
          catch (IOException ex) {
            System.err.println("hashobj.cUdpSocket.send(dp) err");
            System.err.println(ex);
          }
        }
      }
    }
  }

  private void smsSendtoDevice(MsgObj msg) {
    boolean sendOver = false;
    SMSClient Objsms = new SMSClient();
    while (!sendOver) {
      //判段是否SMSClient端口开放
      if (Objsms.OpenSMS(mServer, mPort)) {
        if (Objsms.SendSMS("", msg.cPhoneNum, msg.cMsg)) {//是否发送消息]
            System.out.println("短信将要发送的消息:"+msg.cMsg+"ReadSendQueue");
          sendOver = true;
        }
      }
    }
    Objsms.CloseSMS();
  }
//发送到终端
  private void tcpSendtoTerminal(MsgObj msg) {
    boolean sendOver = false;
    while (!sendOver) {
      if (super.centerMap.containsKey(msg.cDeviceID)) {
        HashObj hashobj = (HashObj)super.centerMap.get(msg.cDeviceID);
        if (hashobj.cTerminalTcpUsed) {
          //分配一个 512字节的数组缓存
          ByteBuffer buffer = ByteBuffer.allocate(512);
          //Wraps a byte array into a buffer.Wraps a byte array into a buffer.
          buffer = ByteBuffer.wrap(msg.cMsg.getBytes());
          if (hashobj.cTerminalKey.isValid()) {
            //把hashobj终端的“键”赋予SocketChannel对象
            SocketChannel TerminalSocket = (SocketChannel) hashobj.cTerminalKey.channel();
            //判断hashobj是否有  “值”
            if (hashobj.cTerminalKey.isWritable()) {
              try {
                //写buffer。
                TerminalSocket.write(buffer);
                sendOver = true;
              }
              catch (IOException ex) {
                System.err.println("terminalSocket.write(buffer) err");
                System.err.println(ex);
              }
            }
          }
        }
        else {
          sendOver = true;
        }
      }
    }
  }

  public void SendToDbServer(MsgObj msg) {
      //DbServer db = new DbServer();
      System.out.println(msg.cMsg + "ReadSendQueue");
      System.out.println(db.toString().trim() + "创建DBSERVER对象ReadSendQueue");
      String string = new String(msg.cMsg.toString().trim());
      db.addVehicleInfo(string);
      System.out.println(msg.cMsg + "ReadSendQueue");
  }

  private void readxml() {
      try {
          File f = new File("CenterInfo.xml");
          if (f.exists()) {
              DocumentBuilderFactory factory = DocumentBuilderFactory.
                                               newInstance();
              DocumentBuilder builder = factory.newDocumentBuilder();
              Document doc = builder.parse(f);
              NodeList nl = doc.getElementsByTagName("Center");
              for (int i = 0; i < nl.getLength(); i++) {
                  mServer = (doc.getElementsByTagName("SmsIp").
                             item(i).getFirstChild().getNodeValue()).trim();
                  mPort = Integer.parseInt((doc.getElementsByTagName(
                          "SmsPort").
                                            item(i).getFirstChild().
                                            getNodeValue()).trim());
              }
          } else {
              System.out.println("no find file:CenterInfo.xml");
              System.exit( -1);
          }
      } catch (Exception e) {
          e.printStackTrace();
          System.exit( -1);
      }
  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -