package com.skywin.simpass.sysinterface.sms.util;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import com.huawei.insa2.comm.cmpp.message.CMPPDeliverMessage;
import com.huawei.insa2.comm.cmpp.message.CMPPMessage;
import com.huawei.insa2.comm.cmpp.message.CMPPSubmitMessage;
import com.huawei.insa2.comm.cmpp.message.CMPPSubmitRepMessage;
import com.huawei.insa2.util.Args;
import com.huawei.smproxy.SMProxy;
import com.skywin.simpass.sysinterface.sms.entity.SMSEntity;
public class SMSClient extends SMProxy {
private static SMSClient ins;
private SMSClient(Args args) {
super(args);
}
public static SMSClient getInstance() {
if (ins == null) {
Map<String, String> m = new HashMap<String, String>();
// 系统参数配置
m.put("host", "host");
m.put("port", "port");
m.put("source-addr", "source-addr");
m.put("shared-secret", "shared-secret");
m.put("heartbeat-interval", "30");
m.put("reconnect-interval", "30");
m.put("heartbeat-noresponseout", "5");
m.put("transaction-timeout", "10");
m.put("version", "0");
m.put("debug", "true");
ins = new SMSClient(new Args(m));
}
return ins;
}
public CMPPMessage onDeliver(CMPPDeliverMessage msg) {
String message = null;
try {
String receivedMsg = new String(msg.getMsgContent(), "UTF-8");
// System.out.println("接收到的消息:"+receivedMsg);
String receivedTelephone = msg.getSrcterminalId();
// System.out.println("接收的手机号码:"+receivedTelephone);
if ((receivedMsg.subSequence(0, 5)).equals("CSize")) {
System.out.println(receivedMsg);
} else {
message = "充值请求信息格式不对";
CMPPSubmitMessage submitMsg = new CMPPSubmitMessage(1, 1, 0, 1,
"0010", 0, "", 0, 0, 15, "950338", "02", Integer
.toString(0),
new Date(System.currentTimeMillis() + (long) 50000), // 存活期
null, "10658672", new String[] { receivedTelephone },
message.getBytes(), "");
// 发送错误信息给用户
SMSClient.getInstance().send(submitMsg);
}
} catch (Exception e) {
}
return super.onDeliver(msg);
}
public void send(CMPPSubmitMessage msg) throws Exception {
CMPPSubmitRepMessage rep = (CMPPSubmitRepMessage) super.send(msg);
// System.out.println(rep.toString());
}
/**
* @param args
*/
public static void main(String[] args) throws Exception {
SMSClient client = SMSClient.getInstance();
System.in.read();
}
}
行距(Leading):又称行间距。指的是行的基线到另一行基线之间的距离(Leading的史称来源于旧式排版时用铅条隔开行之间的距离,读作”ledding”)。
合成(Composition):是一种通篇字符间距的调整以求更好的视觉效果。多数程序都是按行排列文本的,这样可能会造成相邻行间的空格混乱。
字距(Tracking):决定单词中每个字母之间的距离
词间距(Word spacing):决定两个词间合适、最小和最大的距离
字母间距(Letter spacing):决定两字母间合适、最小和最大距离
字偶距调整(Kerning):指两字母间距离的调整。根据字母形状微调字母。实际上,每种字体都已为你做好微调,它们通常用于广告和题头。
成对字偶距调整(Pair kerning):一个表格在InDesign中称为字偶距调整表。表示对想排的字母对自动进行字偶距调整。它常被用于大写标题,因为在这里字母间距的不协调更令人不悦。
对齐(Justification):为使栏或页中的文本各行左右对齐,”对齐”用于增大两词或字母间距。它也指对齐方式:右对齐、左对齐或居中
左对齐(Ragged right and flush left):指文本对齐页面的左边界但右边界不齐
右对齐(Ragged left and flush right):指文本对齐页面的右边界但左边界不齐
居中(Centered):以文本或行的中线为基准两边与页边的距离相等
纵向对齐(Vertical justification):增加两段间距(或两行)以使页面每个栏的顶部和底部对齐。不幸的是,InDesign未设纵向对齐
缩进(Indent):可在每段前加空格的方法表示新段落的开始
伸出(Outdent):表示首行首字母伸出左边界,其他行左边界对齐
块缩进(Block indent):多用于较长引用,从左边界有时从右边界移动整段
悬挂缩进(Hanging indent):表示首行由左边界起始,所有相应行都缩进
项目符号(Bullet):一种字符(通常为实心圆),表示某段在要素列表中是要素之一。可被缩进、伸出或对齐左边界
大写字母下沉(Drop cap):表示一个字母其高度相当于它所在段落中几行的高度。排版员经常用它引起读者注意
保持(Keep):使一定数目的行段彼此相连而不被隔断
样式(Styles):它包含间距、行距、缩进、前导和对齐的属性
样式或样式标注(Style or style tag):是一系列属性。可在整段中应用样式,称为段落样式;也可在高亮显示的字符上应用样式,称为字符样式
连字符(Hyphen):表示行尾的某单词被分隔了或表示连接两次形成新词
连字符连接(Hyphenation):决定被分单词中连字符的位置
连续的连字符连接(Consecutive hyphenation):决定一行中可使用连字符的数量(一般认为一行中三个或更多的连字符是糟糕的排版)
连字符区(Hyphenation zone):决定分割单词的连字符距离右边界的距离
非标准词典(Exception dictionary):列出非标准连字符连接的单词。用户可增加一些排版程序词典中默认的单词和重写某单词的默认连字符连接,例如:proj-cet表名词而pro-ject表动词
随意连字符(Discretionary hyphen):在单词中置入随意连字符会告知程序当此词在行尾处必须被分割开时自动添加连字符。随意连字符只对被置入的单词有效
From: http://blog.sina.com.cn/s/blog_62ba0fdd0100ve9b.html
SObject协议组对所有的Object-C下的objects都生效。
如果objects遵从该协议,就会被看作是first-class objects(一级类)。
另外,遵从该协议的objects的retain,release,autorelease等方法也服从objects的管理和在Foundation中定义的释放方法。一些容器中的对象也可以管理这些objects,比如
说NSArray 和NSDictionary定义的对象。
Cocoa的根类也遵循该协议,所以所有继承NSObjects的objects都有遵循该协议的特性。
NSObjects采用的协议:
NSObject
- autorelease
- class
- conformsToProtocol:
- description
- hash
- isEqual:
- isKindOfClass:
- isMemberOfClass:
- isProxy
- performSelector:
- performSelector:withObject:
- performSelector:withObject:withObject:
- release
- respondsToSelector:
- retain
- retainCount
- self
- superclass
- zone
NSObject是大多数Objective-C类的继承的根类;它没有父类。通过NSObject,其它类继承了一些基础的与Objective-C语言编译器系统之间的接口,并且获得了在它的实例中表现为一个对象的能力。
尽管NSObject不是一个严格的抽象类,实际上它已经是一个类。但是通过它自己一个除了表现为一个简单类之外,NSObject实际上几乎无法完成任 何有用的操作。为你的程序添加任何属性(attributes)并制定实现逻辑,你必须创建一个或者多个从NSObject继承或者父类从 NSObject继承的类(class)。
NSObject采用(adopts,或者说是继承实现)了NSObject协议(protocol)(见“Root Class—and Protocol”(第67页) ) 。NSObject协议(protocol)允许被多个根类(root class)采用,比如NSProxy另一根类(root class),并不是从NSObject继承,但却也采用了NSObject协议(protocol)所以它在Objective-C中便有了和NSObject类相似部分的类的定义(interface)和功能。
NSObject根类,和采用了NSObject协议或者其它根类协议(“root” protocols)一道,为所有的非代理(non-proxy)Cocoa对象指定了以下的定义(interface)和特有的事件:
■Allocation, initialization, 和 duplication。一些NSObject方法(包括一些采用的协议)用来处理创建(creation),初始化(initialization)和复制(duplication)对象。
❏alloc和allocWithZone:方法在内存中为一个对象分配了内存空间并且设置它指向的对象的编译器类定义(即是告诉编译器定义了一个类,译者注)。
❏init方法为对象的属性初始化(prototype),一个让实例变量初始化状态的进程。类方法中的initialize和load让一个类有机会初始化它们自己。
❏new一种方便的结合分配内存和初始化的方法。
❏copy和copyWithZone:方法复制任意对象的内存的实现方法(从NSCopying协议来的);mutableCopy和mutableCopyWithZone:(在NSMutableCopying协议中定义)将被应用于(mplemented by)该类来完成不定的对象拷贝(make mutable copies of their objects)。
■Object retention and disposa(对象的保留和释放)。接下来的方法对于面向对象的程序尤其的重要,那就是如何传统的,明确的,形式化的(traditional, and explicit, form)实现内存管理。
❏retain方法,增加对象的计数器。
❏release方法,减少对象的计数器
❏autorelease方法,自动减少对象的计数器,但是以推迟的方式来实现。
❏retainCount方法,返回一个对象当前的计数器
❏ dealloc方法应用于类来释放对象实例变量并释放动态内存。
■ Introspection 和 comparison(反省机制和对比机制).许多NSObject方法使你能够让编译器查询一个对象。反省方法(introspection methods)帮助你探查一个对象在类继承机制中的位置,决定是否实现一些方法,并测试它是否遵循一些协议。而一些类仅是有一些方法。
❏superclass和class方法(类和实例(class and instance))分别返回接收器的父类和类,作为一个Class对象。
❏ isKindOfClass:和isMemberOfClass:,通过这两种方法可以确定一个类的从属关系。后者测试一个接收器是否是一个指定类的实例;而后者可以测试类的从属关系。
❏ respondsToSelector: 方法测试一个接收器是否通过selector实现(implements)了一个标志符话的方法。而instancesRespondToSelector:测试了一个给定的类实例化之后(这个消息的接收方法为静态方法,译者注)是否实现了一个指定的方法。
❏conformsToProtocol:方法,测试接收器(对象或者类)符合一个给定的协议(protocol)。
❏ isEqual: 和 hash方法,用于对象比较。
❏ description方法,允许一个对象返回一个字符串来描述它的内容;这个常用于调试debugging (“print object”命令 ) 。通过“%@”以字符串输出特殊的指定对象。(即是以NSLog的形式输出,译者注)
参见 “Introspection”(页87)以获取更多的信息
■ Object encoding and decoding(对象的编码和解码).接下来的方法将与对象的编码和解码方式有关 (作为一个归档处理的一部分):
❏encodeWithCoder: 和 initWithCoder:方法,NSCoding协议中仅有的组成成员。第一个允许对象编译它的实例变量,第二个允许一个对象初始化它自身的解码实例变量。
❏NSObject类声明了一些与对象编码相关的其它方法,有:classForCoder,replacementObjectForCoder:,和awakeAfterUsingCoder:。
参阅Archives and Serializations Programming Guide for Cocoa来获取更多的信息。
■ Message forwarding(消息转发). forwardInvocation:允许一个对象把消息转发给另一个对象。
■ Message dispatch(消息配送). 一个以performSelector...为开头的方法允许你配送消息(message)直到指定的延迟后,并且可以从二级线程((synchronously or asynchronously)同步或者不同步地)配送消息到主线程。
NSObject拥有许多其它的方法,比如版本和传递的类方法(class methods for versioning and posing)(之后将为你展示如何将一个类本身编译为另一个类)。它既包括了方法让你访问编译器数据结构的类,比如selector方法和函数指针形式的方法实现。