摘要: 最近我负责一个IM项目的开发,服务端和客户端采用TCP协议连接。服务端采用C#开发,客户端采用Delphi开发。在服务端开发中我碰到了各种各样的网络异常断开现象。在处理这些异常的时候有了一些心得,现在写出来和大家分享一下。那网络异常断开原因主要有那些呢?归纳起来主要有以下两种:1、客户端程序异常。 对于这种情况,我们很好处理,因为客户端程序异常退出会在服务端引发ConnectionReset的Socket异常(就是WinSock2中的10054异常)。只要在服务端处理这个异常就可以了。2、网络链路异常。 如:网线拔出、交换机掉电、客户端机器掉电。当出现这些情况的时候服务端不会出现任何异常。.. 阅读全文
posted @ 2012-10-17 13:22 小麻雀 阅读(365) 评论(0) 推荐(0) 编辑
摘要: 一.在Oracle中可使用Start with...Connect By子句Start with...Connect By子句递归查询一般用于一个表维护树形结构的应用。创建示例表:CREATE TABLE TBL_TEST ( ID NUMBER, NAME VARCHAR2(100 BYTE), PID NUMBER DEFAULT 0 );插入测试数据:INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('1','10','0'); INSERT INTO TBL... 阅读全文
posted @ 2012-09-21 16:14 小麻雀 阅读(16133) 评论(0) 推荐(1) 编辑
摘要: Oracle 9i创建数据库时默认包含了XDB特性。一旦启动了数据库和Listener,Oracle XDB包含HTTP和FTP服务,分别监听TCP 8080和2100端口,刚好和JBoss、Tomcat等默认8080端口冲突,网上找到的办法多是修改端口号,今日好不容易找到一个关闭XDB HTTP/FTP服务的方法,特地记录在blog上。1、首先:找到Oracle安装目录下admin\ccdb\pfile\init.ora.*文件,例如:E:\oracle\admin\ccdb\pfile\init.ora.3302008184462、找到该文件后,注释掉下面一行并保存。如下:#dispatc 阅读全文
posted @ 2012-09-21 16:10 小麻雀 阅读(1620) 评论(0) 推荐(0) 编辑
摘要: 数据库的设计范式是数据库设计所需要满足的规范,满足这些规范的数据库是简洁的、结构明晰的,同时,不会发生插入(insert)、删除(delete)和更新(update)操作异常。反之则是乱七八糟,不仅给数据库的编程人员制造麻烦,而且面目可憎,可能存储了大量不需要的冗余信息。 范式说明 第一范式(1NF):数据库表中的字段都是单一属性的,不可再分。这个单一属性由基本类型构成,包括整型、实数、字符型、逻辑型、日期型等。 这点相信没有人会违反的。现在的DBMS已经限定死了。 第二范式(2NF):数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖(部分函数依赖指的是存在组合关... 阅读全文
posted @ 2012-09-21 16:08 小麻雀 阅读(180) 评论(0) 推荐(0) 编辑
摘要: 经常,我们在启动应用的时候发现系统需要的端口被别的程序占用,如何知道谁占有了我们需要的端口?1、Windows平台在windows命令行窗口下执行:E:\oracle\ora92\bin>netstat -ano |find ":80" TCP 172.18.2.56:3311 172.18.40.3:80 ESTABLISHED 3704 TCP 172.18.2.56:3319 172.18.65.7:80 ESTABLISHED 3704 TCP 172.18.2.56:4641 ... 阅读全文
posted @ 2012-09-21 16:07 小麻雀 阅读(867) 评论(0) 推荐(1) 编辑
摘要: Oracle数据导入导出imp/exp就相当于oracle数据还原与备份。exp命令可以把数据从远程数据库服务器导出到本地的dmp文件,imp命令可以把dmp文件从本地导入到远处的数据库服务器中。利用这个功能可以构建两个相同的数据库,一个用来测试,一个用来正式使用。执行环境:可以在SQLPLUS.EXE或者DOS(命令行)中执行,DOS中可以执行时由于 在oracle 8i 中安装目录\ora81\BIN被设置为全局路径,该目录下有EXP.EXE与IMP.EXE文件被用来执行导入导出。oracle用java编写,SQLPLUS.EXE、EXP.EXE、IMP.EXE这两个文件有可能是被包装后的 阅读全文
posted @ 2012-09-21 16:06 小麻雀 阅读(228) 评论(0) 推荐(0) 编辑
摘要: 使用PowerDesigner生成数据库建表SQL脚本时,尤其是Oracle数据库时,表名一般会带引号。其实加引号是PL/SQL的规范,数据库会严格按照“”中的名称建表,如果没有“”,会按照ORACLE默认的设置建表(DBASTUDIO里面),默认是全部大写,这样,在ORACLE数据库里的字段就如“Column_1”。如果你把引号去掉,ORACLE自动默认为全部大写,即“COLUMN_1”,所以这段SQL在PL/SQL中执行的时候是没有任何问题的,如果不加引号,在PL/SQL会自动识别为大写。如果加了引号,sql或者hql查询“Column_1='XXX'”时,就会报错:ORA 阅读全文
posted @ 2012-09-21 16:05 小麻雀 阅读(1737) 评论(0) 推荐(0) 编辑
摘要: 一、在oracle11G以前卸载oracle会存在卸载不干净,导致再次安装失败的情况,在运行services.msc打开服务,停止Oracle的所有服务。二、 oracle11G自带一个卸载批处理\app\Administrator\product\11.2.0\dbhome_1\deinstall\deinstall.bat运行该批处理程序将自动完成oracle卸载工作,最后手动删除\app文件夹(可能需要重启才能删除)运行过程中可能需要填写如下项:指定要取消配置的所有单实例监听程序[LISTENER]:LISTENER指定在此 Oracle 主目录中配置的数据库名的列表 [MYDATA,O 阅读全文
posted @ 2012-09-21 10:30 小麻雀 阅读(16885) 评论(0) 推荐(1) 编辑
摘要: 1.问题:在Socket通信中,我们经常要多客户端共用一个端口,但这往往会报错,因为正常来说一个端口只能绑定一次,但释放的时候比较麻烦,所以还是要是实现端口共用的话,就不用执行一个关一个再开一个。 2.实现端口复用: 正常绑定://定义网络地址,连接类型与网络协议并绑定本地IP与端口 socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); ipPoint = new IPEndPoint(IPAddress.Parse(ipAdrr)... 阅读全文
posted @ 2012-09-11 17:16 小麻雀 阅读(3847) 评论(1) 推荐(1) 编辑
摘要: Socket协议的形象描述socket的 英文原义是“孔”或“插座”。在这里作为4BDS UNIX的进程通信机制,取后一种意思。socket非常类似于电话插座。以一个国家级电话网为例。电话的通话双方相当于相互通信的2个进程,区号是它的网络地址;区内一个单位的交换机相当于一台主机,主机分配给每个用户的局内号码相当于socket号。任何用户在通话之前,首先要占有一部电话机,相当于申请一个socket;同时要知道对方的号码,相当于对方有一个固定的socket。然后向对方拨号呼叫,相当于发出连接请求(假如对方不在同一区内,还要拨对方区号,相当于给出网络地址)。对方假如在场并空闲(相当于通信的另一主机开 阅读全文
posted @ 2012-09-11 15:31 小麻雀 阅读(12860) 评论(0) 推荐(0) 编辑
摘要: 最近学习UDP编程,头都搞大了,找了不少资料,也请教了不少同行,自认为下面这篇资料写的很好,所以收藏之,以供参考. 1.在进行UDP编程的时候,我们最容易想到的问题就是,一次发送多少bytes好? 当然,这个没有唯一答案,相对于不同的系统,不同的要求,其得到的答案是不一样的,我这里仅对 像ICQ一类的发送聊天消息的情况作分析,对于其他情况,你或许也能得到一点帮助: 首先,我们知道,TCP/IP通常被认为是一个四层协议系统,包括链路层,网络层,运输层,应用层. UDP属于运输层,下面我们由下至上一步一步来看: 以太网(Ethernet)数据帧的长度必须在46-1500字节之间,这是... 阅读全文
posted @ 2012-08-11 14:11 小麻雀 阅读(541) 评论(0) 推荐(0) 编辑
摘要: 最近由于在做聊天调度服务,场景是这样的,集群聊天服务器,每台服务通过socket按照一定的频率发送UDP数据包给调度服务器,调度服务器接收各台聊天服务器发来的数据包,然后进行相应的数据分析,最后裁定目前最空闲的聊天服务器,以供聊天用户实时快速连接最优服务器,我考虑使用Dictionary数据结构来缓存收集到的服务器汇总数据,开发的过程中遇到几个比较棘手的问题:1、收集的数据是通过多线程进行的,这样造成Dictionary线程安全的问题。针对Dictionary线程安全的问题,我通过继承IDictionary,重新构造线程安全Dictionary对象,这里其实没有什么复杂的,只是在Diction 阅读全文
posted @ 2012-08-06 16:44 小麻雀 阅读(11631) 评论(0) 推荐(2) 编辑
摘要: 这里主要是讲MongoDB在控制台中如何进行高级查询,既有教程内容,也有ME动手实验的经验,搞懂了这些规则,对于你再使用其他语言(Java,ruby,python等)实现查询时有莫大的帮助,因为基础的是相通的,只是不同的语言实现接口略有差异而已。还有一句想提醒大家,多动手实验,才是硬道理。<,>,>=,<=这四个就不用解释了,最常用的,也是最简单的。db.collection.find({ "field" : { $gt: value } } ) // 大于 : field > valuedb.collection.find({ "f 阅读全文
posted @ 2012-06-27 14:20 小麻雀 阅读(338) 评论(0) 推荐(0) 编辑
摘要: 第一步:下载MongoDB软件包下载地址:http://www.mongodb.org/downloads,下载Windows 32-bit的软件包即可第二步:解压下载好的软件包,到D盘,最好不要建在C盘,以防重装系统带来的麻烦,解压到D盘之后,最好重命名一下文件夹名称,我这里命名mongodb,如图:第三步:开始MongoDB的安装1、通过命令窗口定位到MongoDB的bin文件夹路径:2、运行安装命令:3、安装成功之后,通过命令启动服务,这里的mongodb是以windows服务来运行的:4、测试mongodb的数据库服务是否已经能正常服务:第四步:以上过程完成之后,恭喜你,可以开始mon 阅读全文
posted @ 2012-06-27 10:24 小麻雀 阅读(1045) 评论(0) 推荐(0) 编辑
摘要: 首先要明白线程的工作原理,jvm有一个main memory,而每个线程有自己的working memory,一个线程对一个variable进行操作时,都要在自己的working memory里面建立一个copy,操作完之后再写入main memory。多个线程同时操作同一个variable,就可能会出现不可预知的结果。根据上面的解释,很容易想出相应的scenario。 而用synchronized的关键是建立一个monitor,这个monitor可以是要修改的variable也可以其他你认为合适的object比如method,然后通过给这个monitor加锁来实现线程安全,每个线程在获得这个 阅读全文
posted @ 2012-06-26 13:35 小麻雀 阅读(132066) 评论(5) 推荐(18) 编辑