![]() |
|
女儿出生了,太可爱了~
作者:火车头 日期:2008-11-28 17:44
HTTP Response中的Chunked编码
作者:火车头 日期:2008-10-29 14:35
进行Chunked编码传输的HTTP Response会在消息头部设置:
Transfer-Encoding: chunked
表示Content Body将用Chunked编码传输内容。
Chunked编码使用若干个Chunk串连而成,由一个标明长度为0的chunk标示结束。每个Chunk分为头部和正文两部分,头部内容指定下一段正文的字符总数(十六进制的数字)和数量单位(一般不写),正文部分就是指定长度的实际内容,两部分之间用回车换行(CRLF)隔开。在最后一个长度为0的Chunk中的内容是称为footer的内容,是一些附加的Header信息(通常可以直接忽略)。具体的Chunk编码格式如下:
Chunked-Body = *chunk
"0" CRLF
footer
CRLF
chunk = chunk-size [ chunk-ext ] CRLF
chunk-data CRLF
hex-no-zero = <HEX excluding "0">
chunk-size = hex-no-zero *HEX
chunk-ext = *( ";" chunk-ext-name [ "=" chunk-ext-value ] )
chunk-ext-name = token
chunk-ext-val = token | quoted-string
chunk-data = chunk-size(OCTET)
footer = *entity-header
RFC文档中的Chunked解码过程如下:
length := 0
read chunk-size, chunk-ext (if any) and CRLF
while (chunk-size > 0) {
read chunk-data and CRLF
append chunk-data to entity-body
length := length + chunk-size
read chunk-size and CRLF
}
read entity-header
while (entity-header not empty) {
append entity-header to existing header fields
read entity-header
}
Content-Length := length
Remove "chunked" from Transfer-Encoding
最后提供一段PHP版本的chunked解码代码:
$chunk_size = (integer)hexdec(fgets( $socket_fd, 4096 ) );
while(!feof($socket_fd) && $chunk_size > 0) {
$bodyContent .= fread( $socket_fd, $chunk_size );
fread( $socket_fd, 2 ); // skip \r\n
$chunk_size = (integer)hexdec(fgets( $socket_fd, 4096 ) );
}
From:http://www.zeali.net/entry/129
【不断更新】一些常用类的运行时变量参考
作者:火车头 日期:2008-10-13 20:52
C#改装dll成com实战
作者:火车头 日期:2008-10-06 17:07
1、用sn工具生成用于强命名的密钥 sn.exe -k test.snk
2、程序属性中配置好为程序签名并选择密钥,选择为com Interop注册和程序集中使用程序集COM可见
3、using System.Runtime.InteropServices;//为了调用GUID
using System.EnterpriseServices;//引用COM+的类
public interface ISharpObject2
{
Segment seg
{
get;
set;
}
Segment loaddic();
string segword(Segment seg, string str);
}
public class PHPSeg : ServicedComponent, ISharpObject2
{
private Segment _seg;
public Segment seg //Property: Name, Get/Set
{
get { return _seg; }
set { _seg = value; }
}
public Segment loaddic()
{
Segment seg = new Segment();
seg.InitWordDics();
return seg;
//label_Time.Text = seg.EventTime.ToString();
}
public string segword(Segment seg,string str)
{
//分词
if (seg != null)
{
seg.Separator = "/";
str = seg.SegmentText(str, true);
return str;
}
else return "";
}
}
4、regsvcs /fc your.dll注册 /u销毁
给朋友做的一个关于事件的简单代码,发上来希望对初学者也有些用
作者:火车头 日期:2008-10-04 20:15
- public class TestEvent
- {
- public TestEvent()
- {
- }
- //计算1--20的和
- public int caculate()
- {
- int n = 0;
- for (int i = 0; i < 20; i++)
- {
- n += i;
- System.Threading.Thread.Sleep(200);
- OnStateChanged("正在加" + i + " \r\n");
- //System.Threading.Thread.Sleep(200);
- }
- return n;
- }
- public delegate void StateHandler(object sender, StateEventArgs e);
- public event StateHandler StateChanged;
- private void OnStateChanged(string s)
- {
- if (this.StateChanged != null)
- this.StateChanged(this, new StateEventArgs(s));
- }
- }
- public class StateEventArgs : EventArgs
- {
- private string state;
- public string State
- {
- get
- {
- return state;
- }
- }
- public StateEventArgs(string s)
- {
- this.state = s;
- }
- }
用的一个Form的界面(一个label1 和一个button1)
主要调用代码
- delegate void settextcallback(string text);
- private void setlabeltext(string text)
- {
- if (this.label1.InvokeRequired)
- {
- settextcallback se = new settextcallback(setlabeltext);
- this.Invoke(se, new object[] { text });
- }
- else
- {
- this.label1.Text = text;
- }
- }
- public Form1()
- {
- InitializeComponent();
- }
- private void te_StateChanged(object sender,StateEventArgs e)
- {
- setlabeltext(e.State);
- }
- private void button1_Click(object sender, EventArgs e)
- {
- System.Threading.Thread th = new System.Threading.Thread(new System.Threading.ThreadStart(threadfunc));
- th.Start();
- }
- private void threadfunc()
- {
- TestEvent te = new TestEvent();
- te.StateChanged += new TestEvent.StateHandler(te_StateChanged);
- int n = te.caculate();
- MessageBox.Show("结果是" + n.ToString());
- }
Form1里面的 InitializeComponent(); 就不贴了~~~
希望对类里面事件的写法有所帮助
SharpDevelop源码-用户界面
作者:火车头 日期:2008-10-03 04:07
相关概念
Demo代码分析
总结
Demo下载
1、Demo界面及功能解释:
启动界面:

支持打开图片:

支持打开网页:

功能说明:程序有个浮动窗口显示当前磁盘文件,选择文件并双击后在中心窗口中以适当的察看器打开文件;持拖曳打开文件;程序关闭后再次启动时能够“记忆”前一次程序关闭时的窗体大小位置及打开过的文件。
2、相关概念:
主窗体部分: Workbench
磁盘文件查看窗口: Pad
文件查看窗口: ViewContent
说明:
Pad可以使用ICSharpCode.Core的Addin插件机制来扩充Pad,如Visual Studio的资源管理器、类查看器、属性窗口、消息窗口等都属于Pad
ViewContent同样支持插件扩充,根据不同的文件类型使用不同的控件来处理显示,Demo中已实现的文件类型支持:网页文件、图片、普通文本,Visual Studio中的代码窗口、窗体设计器、资源编辑器、对象查看器等都属于ViewContent
Workbench与WorkbenchLayout结合使用来控制主窗口的外观显示,如普通的MDI(PhotoShop?)或Demo使用的WeifenLuo.WinFormsUI.Docking显示方式……
3、Demo代码分析
(注:下面的分析前提是你已经了解如何使用ICSharpCode.Core的Addin插件机制)
通过上面的界面及功能说明,可以确定程序至少应包括接口声明、基本实现两个项目,而接口中又分为:Pad接口、ViewContent接口、Workbench接口,这样的程序设计重点与难点在哪呢?思考后的结果应该是接口,从接口中能看到程序各部分是如何交互的,以及插件的扩展点,接口的设计好坏决定着程序的易维护性与易扩展性,所以下面就重点看接口的定义(附介绍相关对象的创建等):
接下来看Pad的xml声明及客户端调用:
配置文件中的class指定了实现IPadContent的一个类型(全称限定名),使用时通过ICSharpCode.Core的AddInTree对象构建相关PadDescriptor集合……
下面来看ViewContent的定义:
可以看到IViewContent同样是返回一个Conrol,供使用端(SdiWorkspaceWindow)根据需要封装组合;DisplayBindingDescriptor同样是个辅助类,除了返回ViewContent的相关属性信息外,提供了bool CanAttachToFile(string fileName)方法,用以判断当前显示插件是否可以显示相关类型的文件,这里的判断是通过配置文件中的fileNamePattern属性作正则判断(注:文件名称符合一定规则的可能会用到此属性,一般不常用),注意到该辅助类返回了一个IDisplayBinding接口,查看该接口的方法可以看到使用它来更进一步地判断当前文件是否是可支持类型(通过文件扩展名或试读取等方式),如果属于该插件支持类型的文件则创建并返回IViewContenet接口。ViewContent插件的声明如下:
值得注意的是insertbefore, insertafter 属性,此属性指明获取所有DisplayBindingDescriptor后的先后顺序,如:一个.rtf文件可以由Office-Word和记事本打开,一般要优先选择使用Word打开。
获取ViewContent对象的过程如下:双击磁盘文件Pad中的一个文件项时,调用FileService中的OpenFile(string fileName)方法,相关代码如下:
接下来看主窗体的定义:
IWorkbench定义主窗体,IWorkbenchLayout定义窗体布局,可以看到IWorkbench的两个重要属性是Pad和ViewContent的对象集合(维护已打开的窗体记录,避免重复打开等作用),其实现类的ShowPad()/ShowView()方法执行的操作即向对应的集合添加成员,然后调用IWorkbenchLayout的ShowPad()/ShowView()。IWorkbenchLayout的LoadConfiguration()和StoreConfiguration()方法用以在窗体加载或关闭时执行加载或保存子窗口布局的操作。
至此Demo的核心已分析完了,我们可以根据定义的接口扩展程序,如增加项目管理/查看Pad, 增加.swf等文件查看的ViewContent, 或更换主界面显示为普通MDI方式……
4、总结:
此Demo更说明了ICSharpCode.Core的插件支持可以应用到很多的方面:
a, 界面组成部分Pad
b, 界面中不同类型的文件查看器ViewContent
c, 磁盘文件查看Pad的下侧文件列表针对不同文件显示相关图标(详见SD_UI.addin文件的"/Workspace/Icons"层次下的定义)
...
SharpDevelop的这种界面设计方案使得应用程序很容易扩展和进一步开发,而不与已开发的模块冲突;从中得到的启发是应用程序要重点设计接口(契约)以及处理对象间的关系……
说明:Demo代码基本来源于SharpDevelop源码,删改了部分代码以使Demo精简和突出重点。
转自:http://www.cnblogs.com/michael-zhang/articles/629724.html
解决Dtools 3.47在windows server2008安装后蓝屏,不兼容的问题
作者:火车头 日期:2008-09-23 16:09
看蓝屏的说明。是驱动的问题。尝试删除Dtools的安装文件夹。重启后依旧蓝屏。。
刚好有两个系统,一个xp...想过先进xp查找Dtools安装时安装的.sys驱动删除看看。。。进入windows/system32/drivers/删除 d347bus.sys和d347prt.sys两个驱动文件
成功!
可以启动windows 2008了
重新下载安装最新版本Daemon Tools Lite 4.12.1可以解决该问题。
另外桌面图标大小过大
距离的设置 在桌面右键 ->自定义设置 ->外观 —>高级 的图标间距(垂直)和图标间距(水平)里设置 我的电脑设置成36比较合适
记下犯的弱智问题 & 常用的几个连接语句模板
作者:火车头 日期:2008-09-17 12:05
Mysql连接语句中的字符集编码只支持 utf8,不支持utf-8这样的写法,害得调试找了半天。发下我常用的几个模板,具体使用你可以去替换。或写成一个static函数。sqlserver因为在程序中考虑到和access的兼容,使用的是oledb的连接方式
- /// <summary>
- /// Mysql连接语句模板
- /// </summary>
- public static string connMysqlTemplate = "server=[数据库路径];user id=[用户名]; password=[密码]; database=[数据库]; pooling=false;charset=[编码];Port=[端口];";
- /// <summary>
- /// SqlServer连接语句模板
- /// </summary>
- public static string connSqlServerTemplate = "Provider=Microsoft.Jet.OLEDB.4.0;Password=;User ID=[用户名];Data Source=[数据库];Jet OLEDB:Database Password=[密码]";
- /// <summary>
- /// Sqlite连接语句模板
- /// </summary>
- public static string connSqliteTemplate = "Provider=SQLiteOLEDB;Data Source=[数据库路径]";
- /// <summary>
- /// Access连接语句模板
- /// </summary>
- public static string connAccTemplate = "Provider=Microsoft.Jet.OLEDB.4.0;Password=;User ID=;Data Source=[数据库路径];Jet OLEDB:Database Password=";
·若要轉載本blog内容請註明轉載地址和作者名字,禁止無權轉載/盜鏈等無恥行爲。
·如有轉載侵權請聯系刪除。
·謝謝合作。^_^









