一、联合的定义
定义一个联合类型的一般形式为:
union 联合名
{
成员表
};
成员表中含有若干成员,成员的一般形式为: 类型说明符 成员名 成员名的命名应符合标识符的规定。
例如:
union perdata
{
int class;
char office;
};
定义了一个名为perdata的联合类型,它含有两个成员,一个为整型,成员名为class;另一个为字符数组,数组名为office。联合定义之后,即可进行联合变量说明,被说明为perdata类型的变量,可以存放整型量class或存放字符数组office。
二、联合变量的说明
联合变量的说明和结构变量的说明方式相同, 也有三种形式。即先定义,再说明;定义同时说明和直接说明。以perdata类型为例,说明如下:
union perdata
{
int class;
char officae;
};
union perdata a,b; /*说明a,b为perdata类型*/
或者可同时说明为:
union perdata
{
int class;
char office;
}a,b;
或直接说明为:
union
{
int class;
char office;
}a,b
经说明后的a,b变量均为perdata类型。 它们的内存分配示意图如图7—8所示。a,b变量的长度应等于 perdata 的成员中最长的长度, 即等于
office数组的长度,共10个字节。从图中可见,a,b变量如赋予整型值时,只使用了2个字节,而赋予字符数组时,可用10个字节。
最近有网友 基于宝贝鱼(CshBBrain)开发聊天类应用 遇到群发、广播消息的问题,现已处理,将处理过程贴出来 供开发这方面应用的朋友参考,少走弯路。(宝贝鱼(CshBBrain) 的使用问题本想开一个群组讨论的,在iteye上我无法再创建群组了,只有贴到专栏来了)
在运行股票的那个示例程序时,配置文件中broadSwitch=1。
但运行两个客户端页面时,只会有一个页面可以成功接收到消息,而另一个页面会进入onerror方法,请问这是为什么?我如何能查看onerror(event)的详细错误信息?event.data和event.text两个属性不行。
谢谢!
http://cshbbrain.iteye.com/blog/1724397
请教一个在使用Websocket服务端时关于消息广播的问题
请问我如何才能在WebSocketProcesser或Service中接收客户端请求中的数据再把它广播出去?MasterServer.addBroadMessage(rs);调用这个方法会报错。
谢谢!
请教一个在使用Websocket服务端时关于消息广播的问题
我想模仿Tomcat7的那几个WebSocket示例基于您的服务端实现一下,但对广播的使用目前还搞不清楚,做chat.html和snake.html两个实例时有困难,麻烦您能给简要说一说实现的思路吗?谢谢。
请教一个消息广播的问题
public Response service(Client sockector, HashMap<String, String> requestData){ if(requestData == null){ return null; } log.info(requestData.get(Constants.FILED_MSG)); Response responseMessage = null; try{ if(!MyStringUtil.isBlank(requestData.get(Constants.HANDSHAKE))){ responseMessage = Response.msgOnlyBody(requestData.get(Constants.FILED_MSG)); }else{ responseMessage = Response.msgOnlyBody("Hello," + requestData.get(Constants.FILED_MSG)); } }catch(Exception e){ e.printStackTrace(); responseMessage = Response.msgOnlyBody("500处理失败了"); } return responseMessage; }
请问,在Service中我如何广播消息。我尝试过这样
Response responseMessage = null; if(!MyStringUtil.isBlank(requestData.get(Constants.HANDSHAKE))){ responseMessage = Response.msgOnlyBody(requestData.get(Constants.FILED_MSG)); }else{ responseMessage = Response.msgOnlyBody("Hello," + requestData.get(Constants.FILED_MSG)); } MasterServer.addBroadMessage(responseMessage);
但是会报如下错误信息
java.lang.NullPointerException at com.jason.server.Response.msgRespose(Response.java:120)
麻烦您时间方便请指点一下该怎样实现。
看了下你的问题,CshBBrain最新版本有个问题修改下就可以了。我直接贴代码:
MyStringUtil.java
添加属性:
public static final String CSHBBRAIN_CONTENT = "CSHBBRAIN_CONTENT";
修改方法:
public static HashMap<String,String> parseKeyValue(String msg){
if(isBlank(msg)){
return null;
}
String values = null;
try{
values = URLDecoder.decode(msg, CoderUtils.UTF8);
}catch(UnsupportedEncodingException e){
throw new UnsupportedCharsetException(CoderUtils.UTF8);
}
HashMap<String,String> requestData = new HashMap<String,String>();
requestData.put(CSHBBRAIN_CONTENT, values);// 所有信息
Matcher m = PARAM_PATTERN.matcher(values);
int pos = 0;
while (m.find(pos)) {
pos = m.end();
requestData.put(m.group(1), m.group(2));
}
return requestData;
}
Service.java
public Response service(Client sockector, HashMap<String, String> requestData){
if(requestData == null){
return null;
}
Response responseMessage = null;
try{
if(!MyStringUtil.isBlank(requestData.get(Constants.HANDSHAKE))){
responseMessage = Response.msgOnlyBody(requestData.get(Constants.FILED_MSG));
}else{
MasterServer.addBroadMessage(Response.msgOnlyBody("hello " + requestData.get(MyStringUtil.CSHBBRAIN_CONTENT)));
responseMessage = Response.msgOnlyBody("hello "
最近学习到StringBuffer,心中有好些疑问,搜索了一些关于String,StringBuffer,StringBuilder的东西,现在整理一下。
关于这三个类在字符串处理中的位置不言而喻,那么他们到底有什么优缺点,到底什么时候该用谁呢?下面我们从以下几点说明一下
1.三者在执行速度方面的比较:StringBuilder > StringBuffer > String
2.String <(StringBuffer,StringBuilder)的原因
String:字符串常量
StringBuffer:字符创变量
StringBuilder:字符创变量
从上面的名字可以看到,String是“字符创常量”,也就是不可改变的对象。对于这句话的理解你可能会产生这样一个疑问 ,比如这段代码:
1 String s = "abcd"; 2 s = s+1; 3 System.out.print(s);// result : abcd1
我们明明就是改变了String型的变量s的,为什么说是没有改变呢? 其实这是一种欺骗,JVM是这样解析这段代码的:首先创建对象s,赋予一个abcd,然后再创建一个新的对象s用来 执行第二行代码,也就是说我们之前对象s并没有变化,所以我们说String类型是不可改变的对象了,由于这种机制,每当用String操作字符串时,实际上是在不断的创建新的对象,而原来的对象就会变为垃圾被GC回收掉,可想而知这样执行效率会有多底。
而StringBuffer与StringBuilder就不一样了,他们是字符串变量,是可改变的对象,每当我们用它们对字符串做操作时,实际上是在一个对象上操作的,这样就不会像String一样创建一些而外的对象进行操作了,当然速度就快了。
3.一个特殊的例子:
String str = “This is only a” + “ simple” + “ test”; 3 StringBuffer builder = new StringBuilder(“This is only a”).append(“ simple”).append(“ test”);
你会很惊讶的发现,生成str对象的速度简直太快了,而这个时候StringBuffer居然速度上根本一点都不占优势。其实这是JVM的一个把戏,实际上:
String str = “This is only a” + “ simple” + “test”;
其实就是:
String str = “This is only a simple test”;
所以不需要太多的时间了。但大家这里要注意的是,如果你的字符串是来自另外的String对象的话,速度就没那么快了,譬如:
String str2 = “This is only a”;
String str3 = “ simple”;
String str4 = “ test”;
String str1 = str2 +str3 + str4;
这时候JVM会规规矩矩的按照原来的方式去做。
4.StringBuilder与 StringBuffer
StringBuilder:线程非安全的
StringBuffer:线程安全的
当我们在字符串缓冲去被多个线程使用是,JVM不能保证StringBuilder的操作是安全的,虽然他的速度最快,但是可以保证StringBuffer是可以正确操作的。当然大多数情况下就是我们是在单线程下进行的操作,所以大多数情况下是建议用StringBuilder而不用StringBuffer的,就是速度的原因。
对于三者使用的总结: 1.如果要操作少量的数据用 = String
2.单线程操作字符串缓冲区 下操作大量数据 = StringBuilder
3.多线程操作字符串缓冲区 下操作大量数据 = StringBuffer