http 请求与相应

首先说一下访问web依次会用到什么协议



## DNS->TCP->HTTP->IP->ARP

  1. 浏览器输入网址 baidu.com

  2. DNS 域名解析 浏览器根据域名解析IP地址

DNS有2中查询方式:递归、迭代,可以分别表示为:

域名解析原理:

1>一个域中的每个主机名与其IP地址的映射关系由这个域的DNS服务器负责管理,例如,”www.it.org”、“ftp.it.org”、“blog.it.org”等主机名都由管理域“it.org”的DNS服务器进行管理,而不能由管理域“org”的DNS服务器进行管理。

2>每个管理域都必须在其直接父域的DNS服务器上注册该子域的名称和该子域的DNS服务器的IP地址,例如,必须在管理域“org”的DNS服务器注册子域“it.org”和其DNS服务器的IP地址后,域名“it.org”才能真正被外界所认可。

3>为了方便对顶级域名的统一管理,在顶级域名之上其实还有一个根域名,根域名用点(.)表示,例如,“www.it.org”也可以写为“www.it.org.”,“www.it.org.”中的最后的那个点(.)就表示根域名。 Internet中的根域名由InterNIC(国际互联网络信息中心)集中管理,顶级域名和其下的域名则由拥有该域名的组织、公司和个人自己管理。

  1. 浏览器与web服务器建立一个TCP 面向连接 双向 可靠 字节流

三次握手与四次断开

所谓三次握手(Three-way Handshake),是指建立一个 TCP 连接时,需要客户端和服务器总共发送3个包。

三次握手的目的是连接服务器指定端口,建立 TCP 连接,并同步连接双方的序列号和确认号,交换 TCP 窗口大小信息。在 socket 编程中,客户端执行 connect() 时。将触发三次握手。

握手

TCP 的连接的拆除需要发送四个包,因此称为四次挥手(Four-way handshake),也叫做改进的三次握手。客户端或服务器均可主动发起挥手动作,在 socket 编程中,任何一方执行 close() 操作即可产生挥手操作。

  1. HTTP 报文

浏览器向web服务器发送一个http请求



POST /search HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint,
application/msword, application/x-silverlight, application/x-shockwave-flash, /
Referer: <a href=”http://www.google.cn/">http://www.google.cn/</a&gt;
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; TheWorld)
Host: <a href=”http://www.google.cn">www.google.cn</a&gt;
Connection: Keep-Alive
Cookie: PREF=ID=80a06da87be9ae3c:U=f7167333e2c3b714:NW=1:TM=1261551909:LM=1261551917:S=ybYcq2wpfefs4V9g;
NID=31=ojj8d-IygaEtSxLgaJmqSjVhCspkviJrB6omjamNrSm8lZhKy_yMfO2M4QMRKcH1g0iQv9u-2hfBW7bUFwVh7pGaRUb0RnHcJU37y-
FxlRugatx63JLv7CWMD6UB_O_r

hl=zh-CN&source=hp&q=domety
`
### 请求头部:由关键字/值对组成,每行一对,关键字和值用英文冒号”:“分隔。请求头部通知服务器有关于客户端请求的信息,典型的请求头有:

<div>
<pre>`User-Agent:产生请求的浏览器类型。

Accept:客户端可识别的内容类型列表。星号 “ * ” 用于按范围将类型分组,用 “ */* ” 指示可接受全部类型,用“ type/* ”指示可接受 type 类型的所有子类型。

Host:要请求的主机名,允许多个域名同处一个IP地址,即虚拟主机。

Accept-Language:客户端可接受的自然语言。

Accept-Encoding:客户端可接受的编码压缩格式。

Accept-Charset:可接受的应答的字符集。

connection:连接方式(close 或 keepalive)。

Cookie:存储于客户端扩展字段,向同一域名的服务端发送属于该域的cookie。

IP

  1. 用于网络层,提供点到点的服务
  2. 通常划分为A、B、C、D 4类地址快
  3. 广播和多播仅用于UDP(TCP是面向连接的)。
  4. 网络好、子网号、主机号 16+8+8

APR

  1. 主机在发送帧前将目标IP地址转换成目标MAC地址的过程

5. 服务器的永久重定向访问

  • HTTP是无连接无状态
  • 服务器给浏览器响应一个301永久重定向响应,这样浏览器就会访问“http://www.facebook.com/” 而非“http://facebook.com/”
  • 这样就会把访问带www的和不带www的地址归到同一个网站排名下。还有就是用不同的地址会造成缓存友好性变差,当一个页面有好几个名字时,它可能会在缓存里出现好几次。
  • 常用状态码

6. 浏览器跟踪重定向地址

  • 现在浏览器知道了 “HTTP://www.facebook.com/”才是要访问的正确地址,所以它会发送另一个http请求。

7. 服务器处理请求

服务器接收到请求后,确定执行某一请求处理来处理它,执行后台代码,并访问数据库。连通前台生成一个HTML来进行相应请求

8. 服务器向浏览器发回一个HTML相应

  1. 返回时,执行发送时的步骤进行查找

9.释放TCP 连接(4步)

10. 浏览器解析HTML内容

  1. 解析文本并显示

11. 浏览器获取嵌入在HTML中的对象

  1. 会注意到需要获取其他地址内容的标签
  2. 浏览器会在DNS中查找这些域名,发送请求,重定向等等…

12. 浏览器渲染HTML页面

 

参考: http://blog.csdn.net/lzghxjt/article/details/51458540

https://hit-alibaba.github.io/interview/basic/network/HTTP.html

ESLint 使用入门

在团队协作中,为避免低级 Bug、产出风格统一的代码,会预先制定编码规范。使用 Lint 工具和代码风格检测工具,则可以辅助编码规范执行,有效控制代码质量。

有些项目框架为了开发便利则直接集成ESLint校验,在提高便利的同时,也制造了一点小麻烦。以我为例:

之前并没有用过ESLint,也没有听别人说起过;

再入手vue v·2时,编译器提示添加ESLint校验,点击添加后,发现编写的代码里全是bug,对于修改更是无从下手。后来直接在网上找到完整的demo粘贴到项目中,依然有bug。

至此发现错误并非因我而起,后来在万能的网友帮助下才发现原因所在,

所以,还是好好学习吧

 

ESLint 简介

ESLint 由 JavaScript 红宝书 作者 Nicholas C. Zakas 编写, 2013 年发布第一个版本。 NCZ 的初衷不是重复造一个轮子,而是在实际需求得不到 JSHint 团队响应 的情况下做出的选择:以可扩展、每条规则独立、不内置编码风格为理念编写一个 lint 工具。

ESLint 主要有以下特点:

  • 默认规则包含所有 JSLint、JSHint 中存在的规则,易迁移;
  • 规则可配置性高:可设置「警告」、「错误」两个 error 等级,或者直接禁用;
  • 包含代码风格检测的规则(可以丢掉 JSCS 了);
  • 支持插件扩展、自定义规则。
    ESLint 已经宣布支持 JSX,不过目前为 alpha 版本,正式版发布之前可以先使用 eslint-plugin-react 替代。

    Update 2016.04.22

    无疑,无论现状,亦或前景,ESLint 都会是首选的 JavaScript 代码质量控制工具。

使用 ESLint

ESLint 详尽使用参见官方文档,下面罗列的是由 JSHint 迁移到 ESLint 的一些要点。

配置

可以通过以下三种方式配置 ESLint:

  • 使用 .eslintrc 文件(支持 JSON 和 YAML 两种语法);
  • package.json 中添加 eslintConfig 配置块;
  • 直接在代码文件中定义。
    .eslintrc 文件示例

    {
    “env”: {

    <span class="token string">"browser"</span><span class="token punctuation">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span>
    

    },
    “parserOptions”: {

    <span class="token string">"ecmaVersion"</span><span class="token punctuation">:</span> <span class="token number">6</span><span class="token punctuation">,</span>
    <span class="token string">"ecmaFeatures"</span><span class="token punctuation">:</span> <span class="token punctuation">{</span>
      <span class="token string">"jsx"</span><span class="token punctuation">:</span> <span class="token boolean">true</span>
    <span class="token punctuation">}</span>
    

    },
    “globals”: {

    <span class="token string">"angular"</span><span class="token punctuation">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span>
    

    },
    “rules”: {

    <span class="token string">"camelcase"</span><span class="token punctuation">:</span> <span class="token number">2</span><span class="token punctuation">,</span>
    <span class="token string">"curly"</span><span class="token punctuation">:</span> <span class="token number">2</span><span class="token punctuation">,</span>
    <span class="token string">"brace-style"</span><span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">,</span> <span class="token string">"1tbs"</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
    <span class="token string">"quotes"</span><span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">,</span> <span class="token string">"single"</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
    <span class="token string">"semi"</span><span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">,</span> <span class="token string">"always"</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
    <span class="token string">"space-in-brackets"</span><span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">,</span> <span class="token string">"never"</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
    <span class="token string">"space-infix-ops"</span><span class="token punctuation">:</span> <span class="token number">2</span><span class="token punctuation">,</span>
    

    }
    }
    </pre>.eslintrc放在项目根目录,则会应用到整个项目;如果子目录中也包含.eslintrc` 文件,则子目录会忽略根目录的配置文件,应用该目录中的配置文件。这样可以方便地对不同环境的代码应用不同的规则。

    package.json 示例:

    `{
      "name": "mypackage",
      "version": "0.0.1",
      "eslintConfig": {
        "env": {
          "browser": true,
          "node": true
        }
      }
    }
    `
    **文件内配置** 代码文件内配置的规则会覆盖配置文件里的规则。 **禁用 ESLint:**
    `/* eslint-disable */
    var obj = { key: 'value', }; // I don't care about IE8  
    /* eslint-enable */
    `
    **禁用一条规则:**
    `/*eslint-disable no-alert */
    alert('doing awful things');  
    /* eslint-enable no-alert */
    `
    **调整规则:**
    `/* eslint no-comma-dangle:1 */
    // Make this just a warning, not an error
    var obj = { key: 'value', }  
    `

    工作流集成

    ESLint 可以集成到主流的编辑器和构建工具中,以便我们在编写的代码的同时进行 lint。

    编辑器集成

    以 WebStorm 为例,只要全局安装 ESLint 或者在项目中依赖中添加 ESLint ,然后在设置里开启 ESLint 即可。其他编辑可以从官方文档中获得获得具体信息。

    构建系统集成

    在 Gulp 中使用:

    `var gulp = require(‘gulp’);
    var eslint = require(‘gulp-eslint’);

    gulp.task(‘lint’, function() {
    return gulp.src(‘client/app/*/.js’)

    <span class="token punctuation">.</span><span class="token function">pipe</span><span class="token punctuation">(</span><span class="token function">eslint</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
    <span class="token punctuation">.</span><span class="token function">pipe</span><span class="token punctuation">(</span>eslint<span class="token punctuation">.</span><span class="token function">format</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    

    });
    `
    其他构建工具参考官方文档。

    代码风格检测

    在团队协作中,统一的代码风格更具可读性、可维护性。ESLint 内置了一系列有关代码风格的规则,可以根据团队的编码规范设置。

    自定义规则

    显然,ESLint 内置的规则不可能包罗所有需求。可以通过插件实现自定义规则,这是 ESLint 最有卖点的功能。在 NPM 上以 eslintplugin 为关键词,可以搜索到很多插件,包括 eslint-plugin-react。如果有自行开发插件的需求,可以阅读 ESLint 插件开发文档

    以 eslint-plugin-react 为例,安装以后,需要在 ESLint 配置中开启插件,其中 eslint-plugin- 前缀可以省略:

    `{
    “plugins”: [

    <span class="token string">"react"</span>
    

    ]
    }
    </pre> 接下来开启 ESLint JSX 支持(ESLint 内置选项): <pre class=" language-js">{
    “ecmaFeatures”: {

    <span class="token string">"jsx"</span><span class="token punctuation">:</span> <span class="token boolean">true</span>
    

    }
    }
    </pre> 然后就可以配置插件提供的规则了: <pre class=" language-js"> {
    “rules”: {

    <span class="token string">"react/display-name"</span><span class="token punctuation">:</span> <span class="token number">1</span><span class="token punctuation">,</span>
    <span class="token string">"react/jsx-boolean-value"</span><span class="token punctuation">:</span> <span class="token number">1</span>
    

    }
    }

自定义规则都是以插件名称为命名空间的。

结语

至此,ESLint 使用入门就介绍完了。但是,我们不应该仅仅是使用 ESLint 这个工具,更应该学习 ESLint 背后的设计理念:不求大而全,但求搭好扎实的基础架构,提供良好的、可扩展的 API。小到插件,大到应用程序开发,这一原则都适用。

感谢 https://csspod.com/getting-started-with-eslint/?utm_source=tuicool&utm_medium=referral

html实体编码问题

在进行web端与客户端交互时,发现传来的json数据发生了实体编码,导致无法直接进行解析,需要进行一次转化 方法:

<span class="pln">html_entity_decode()</span>`</pre>
<pre class="lang-php prettyprint prettyprinted">`<span class="pun">
&lt;?</span><span class="pln">php
   $str </span><span class="pun">=</span> <span class="str">"{&amp;quot;NickName&amp;quot;:&amp;quot;Tom&amp;quot;}"</span><span class="pun">;</span><span class="pln">
   echo $text </span><span class="pun">=</span><span class="pln"> html_entity_decode</span><span class="pun">(</span><span class="pln">$str</span><span class="pun">);</span><span class="pln">
   echo </span><span class="str">"\n"</span><span class="pun">;</span><span class="pln">
   echo json_decode</span><span class="pun">(</span><span class="str">"$text"</span><span class="pun">)-&gt;</span><span class="typ">NickName</span><span class="pun">;</span>
  <span class="pun">?&gt;</span>

网上查了一点资料,供以后参考

以下资料参考地址:http://blog.csdn.net/wusuopubupt/article/details/8817826

提示:请直接按CTRL+F搜索您要查找的转义字符。

常用表:

No.

文字表記

10進表記

16進表記

文字

Comment

001

&quot;

&#34;

&#x22;

“””

quotation mark = APL quote

002

&amp;

&#38;

&#x26;

“&”

ampersand

003

&lt;

&#60;

&#x3C;

“<”

less-than sign

004

&gt;

&#62;

&#x3E;

“>”

greater-than sign

005

&nbsp;

&#160;

&#xA0;

“ “

no-break space = non-breaking space






## iSO 8859-1 characters








































































































































































































































































































































































































char glyphHTML tag
&nbsp;
¡&iexcl;
¢&cent;
£&pound;
¤&curren;
¥&yen;
¦&brvbar;
§&sect;
¨&uml;
©&copy;
ª&ordf;
«&laquo;
¬&not;
&shy;
®&reg;
¯&macr;
°&deg;
±&plusmn;
²&sup2;
³&sup3;
´&acute;
µ&micro;
&para;
·&middot;
¸&cedil;
¹&sup1;
º&ordm;
»&raquo;
¼&frac14;
½&frac12;
¾&frac34;
¿&iquest;
À&Agrave;
Á&Aacute;
Â&Acirc;
Ã&Atilde;
Ä&Auml;
Å&Aring;
Æ&AElig;
Ç&Ccedil;
È&Egrave;
É&Eacute;
Ê&Ecirc;
Ë&Euml;
Ì&Igrave;
Í&Iacute;
Î&Icirc;
Ï&Iuml;
Ð&ETH;
Ñ&Ntilde;
Ò&Ograve;
Ó&Oacute;
Ô&Ocirc;
Õ&Otilde;
Ö&Ouml;
×&times;
Ø&Oslash;
Ù&Ugrave;
Ú&Uacute;
Û&Ucirc;
Ü&Uuml;
Ý&Yacute;
Þ&THORN;
ß&szlig;
à&agrave;
á&aacute;
â&acirc;
ã&atilde;
ä&auml;
å&aring;
æ&aelig;
ç&ccedil;
è&egrave;
é&eacute;
ê&ecirc;
ë&euml;
ì&igrave;
í&iacute;
î&icirc;
ï&iuml;
ð&eth;
ñ&ntilde;
ò&ograve;
ó&oacute;
ô&ocirc;
õ&otilde;
ö&ouml;
÷&divide;
ø&oslash;
ù&ugrave;
ú&uacute;
û&ucirc;
ü&uuml;
ý&yacute;
þ&thorn;
ÿ&yuml;




## Math symbols












Latin Extended-B
char glyphHTML tag
ƒ&fnof;





















































Arrows
char glyphHTML tag
&larr;
&uarr;
&rarr;
&darr;
&harr;
&crarr;
&lArr;
&uArr;
&rArr;
&dArr;
&hArr;

































































































































































Mathematical Operators
char glyphHTML tag
&forall;
&part;
&exist;
&empty;
&nabla;
&isin;
&notin;
&ni;
&prod;
&sum;
&minus;
&lowast;
&radic;
&prop;
&infin;
&ang;
&and;
&or;
&cap;
&cup;
&int;
&there4;
&sim;
&cong;
&asymp;
&ne;
&equiv;
&le;
&ge;
&sub;
&sup;
&nsub;
&sube;
&supe;
&oplus;
&otimes;
&perp;
&sdot;

































General Punctuation
char glyphHTML tag
&bull;
&hellip;
&prime;
&Prime;
&oline;
&frasl;

































Miscellaneous Technical
char glyphHTML tag
&lceil;
&rceil;
&lfloor;
&rfloor;
&lang;
&rang;













Geometric Shapes
char glyphHTML tag
&loz;

























Miscellaneous Symbols
char glyphHTML tag
&spades;
&clubs;
&hearts;
&diams;




























Letterlike Symbols
char glyphHTML tag
&weierp;
&image;
&real;
&trade;
&alefsym;

























































































































































































































Greek
char glyphHTML tag
Α&Alpha;
Β&Beta;
Γ&Gamma;
Δ&Delta;
Ε&Epsilon;
Ζ&Zeta;
Η&Eta;
Θ&Theta;
Ι&Iota;
Κ&Kappa;
Λ&Lambda;
Μ&Mu;
Ν&Nu;
Ξ&Xi;
Ο&Omicron;
Π&Pi;
Ρ&Rho;
Σ&Sigma;
Τ&Tau;
Υ&Upsilon;
Φ&Phi;
Χ&Chi;
Ψ&Psi;
Ω&Omega;
α&alpha;
β&beta;
γ&gamma;
δ&delta;
ε&epsilon;
ζ&zeta;
η&eta;
θ&theta;
ι&iota;
κ&kappa;
λ&lambda;
μ&mu;
ν&nu;
ξ&xi;
ο&omicron;
π&pi;
ρ&rho;
ς&sigmaf;
σ&sigma;
τ&tau;
υ&upsilon;
φ&phi;
χ&chi;
ψ&psi;
ω&omega;
ϑ&thetasym;
ϒ&upsih;
ϖ&piv;




以管理员身份运行bat文件

方法二
@echo off
cacls.exe "%SystemDrive%\System Volume Information" &gt;nul 2&gt;nul
if %errorlevel%==0 goto Admin
if exist "%temp%\getadmin.vbs" del /f /q "%temp%\getadmin.vbs"
echo Set RequestUAC = CreateObject^("Shell.Application"^)&gt;"%temp%\getadmin.vbs"
echo RequestUAC.ShellExecute "%~s0","","","runas",1 &gt;&gt;"%temp%\getadmin.vbs"
echo WScript.Quit &gt;&gt;"%temp%\getadmin.vbs"
"%temp%\getadmin.vbs" /f
if exist "%temp%\getadmin.vbs" del /f /q "%temp%\getadmin.vbs"
exit

:Admin`</pre>
</div>
<div>
<div>

:Admin后换行跟自己的批处理;
根据实际情况修改“RequestUAC”“%temp%\getadmin.vbs”这两个字段吧。

我做了补充,
一是对于生成的vbs要做清理嘛;

二是要让Wscript执行WScript.Quit来结束进程,不然进程里会一直有脚本解释器在运行;

另外,是关于操作系统的版本这个问题:
(当然可能是自作多情)
我考虑了在低于Vista/2008的情况下,关于UAC的问题。
我有毒...
UAC并不存在于XP里,嗯。

当然我也考虑了把批处理放在低于Vista/2008操作系统里运行的情况:
若是在管理员账户(包括超级管理员)下运行,那就不需要前面这个判断UAC的了;
若是在受限账户下运行,要拿权限,我猜就需要Hack点的手段了吧,不是很懂。

所以如果需要判断操作系统的,那就把这段放最前面:

</div>
<div>
<div>
<pre>`@echo off
ver|findstr "[6,10]\.[0-9]\.[0-9][0-9]*" &gt; nul &amp;&amp; (goto Main)
ver|findstr "[3-5]\.[0-9]\.[0-9][0-9]*" &gt; nul &amp;&amp; (goto isBelowNT6)

:isBelowNT6

:Main




作者:刘楷杰
链接:https://www.zhihu.com/question/34541107/answer/137174053
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

.NET Socket收发数据

在发送数据之前,首发双方约定好统一的端口,数据起始符、结束符

Socket 通过单一信道进行收发数据

 

class Program
{
    static void Main(string[] args)
    {
         ServerController.Listen(8888);

        string data = "我真帅";
        string result = ServerController.Send("127.0.0.1", 8888, data);
        Console.WriteLine("Send:{0}\r\nReceive:{1}", data, result);
        Console.ReadKey();
    }
}

`</pre>
</div>
<div>
<div>
<pre>`public class ServerController //: Controller
{
    /*数据的开始结束符号*/

    /// &lt;summary&gt;
    /// 编码 解码
    /// &lt;/summary&gt;
    private static Encoding encode = Encoding.Default;

    /// &lt;summary&gt;
    /// 监听请求
    /// &lt;/summary&gt;
    /// &lt;param name="port"&gt;端口&lt;/param&gt;
    public static void Listen(int port)
    {

        //IPv4  双向基于连接的字节流  传输控制协议
        Socket listenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        // 将Socket与本地端点相关联
        listenSocket.Bind(new IPEndPoint(IPAddress.Any, port));
        // 挂起连接队列的最大长度
        listenSocket.Listen(100);
        Console.WriteLine("Listen " + port + " ...");
        //循环监听
        while (true)
        {
            //未接收,则一直阻塞
            Socket acceptSocket = listenSocket.Accept();
            try
            {
                //1s timeout.
                string receiveData = Receive(acceptSocket, 1000); 
                Console.WriteLine("Receive:" + receiveData);
                //发送接受状态
                Send(acceptSocket, "ok");
            }
            catch (Exception e)
            {
                //发送接受状态
                Send(acceptSocket, "failed");
                Console.WriteLine(e);
            }

            DestroySocket(acceptSocket); //import
        }
    }

    /// &lt;summary&gt;
    /// 发送数据
    /// &lt;/summary&gt;
    /// &lt;param name="host"&gt;主机名 IP&lt;/param&gt;
    /// &lt;param name="port"&gt;端口&lt;/param&gt;
    /// &lt;param name="data"&gt;数据&lt;/param&gt;
    /// &lt;returns&gt;&lt;/returns&gt;
    public static string Send(string host, int port, string data)
    {

        string result = string.Empty;
        Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        try
        {
            //建立与远程hos的连接
            clientSocket.Connect(host, port);
            ////发送数据
            //clientSocket.Send(encode.GetBytes(data));
            //发送数据data
            Send(clientSocket, data);
            //等待2秒
            result = Receive(clientSocket, 1000 * 2); //1*2 seconds timeout.
            //销毁socket
        }
        catch (Exception e)
        {
            Console.WriteLine("由于目标计算机积极拒绝,无法连接" + e);
        }

        DestroySocket(clientSocket);
        //Console.WriteLine("Send:{0}\r\nReceive:{1}", data, result);

        return result;
    }

    /// &lt;summary&gt;
    /// 发送数据
    /// &lt;/summary&gt;
    /// &lt;param name="socket"&gt;socket&lt;/param&gt;
    /// &lt;param name="data"&gt;数据&lt;/param&gt;
    private static void Send(Socket socket, string data)
    {
        //字符编码为字节序列,然后发送
        socket.Send(encode.GetBytes(data));
    }

    /// &lt;summary&gt;
    /// 接收数据
    /// &lt;/summary&gt;
    /// &lt;param name="socket"&gt;&lt;/param&gt;
    /// &lt;param name="timeout"&gt;&lt;/param&gt;
    /// &lt;returns&gt;&lt;/returns&gt;
    public static string Receive(Socket socket, int timeout)
    {
        string result = string.Empty;
        // 超时
        socket.ReceiveTimeout = timeout;
        List&lt;byte&gt; data = new List&lt;byte&gt;();
        byte[] buffer = new byte[1024];
        try
        {
            //1.若缓冲区buffer比接收数据小,需多次Receive才能完成;
            //2.多次Receive时,每次接收字节数length大小不固定;
            //3.实际接收字节数据
            int length = 0;
            //循环接收数据到接收缓冲区
            while ((length = socket.Receive(buffer)) &gt; 0)
            {
                for (int j = 0; j &lt; length; j++)
                {
                    data.Add(buffer[j]);
                }
            }
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
        }
        if (data.Count &gt; 0)
        {
            //字节转化为字符
            result = encode.GetString(data.ToArray(), 0, data.Count);
        }

        return result;
    }

    /// &lt;summary&gt;
    /// 销毁Socket对象
    /// &lt;/summary&gt;
    /// &lt;param name="socket"&gt;&lt;/param&gt;
    private static void DestroySocket(Socket socket)
    {
        try
        {
            if (socket != null)
            {
                if (socket.Connected)
                {
                    socket.Shutdown(SocketShutdown.Both);
                }
                socket.Close();
            }
            Console.WriteLine("Socket销毁成功");
        }
        catch (Exception e)
        {
            Console.WriteLine("Socket销毁失败" + e);
            throw;
        }

    }
}



https://msdn.microsoft.com/en-us/library/system.net.sockets.socket(v=vs.110).aspx

https://msdn.microsoft.com/en-us/library/2b86d684(v=vs.110).aspx

https://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket_methods(v=vs.80).aspx

.NET Unicode 中文

在线直接转换工具 http://tool.sufeinet.com/Code/ChineseUnicode.aspx

//可以包括其他字符         
public string uncode(string str)  
{  
    string outStr = "";  
    Regex reg = new Regex(@"(?i)//u([0-9a-f]{4})");  
    outStr = reg.Replace(str, delegate(Match m1)  
    {  
        return ((char)Convert.ToInt32(m1.Groups[1].Value, 16)).ToString();  
    });  
    return outStr;  
}  

//中文转为UNICODE字符  

string str = "中文";  
string outStr = "";  
if (!string.IsNullOrEmpty(str))  
{                  
    for (int i = 0; i &lt; str.Length; i++)  
    {  
        //将中文字符转为10进制整数,然后转为16进制unicode字符  
        outStr += "//u" + ((int)str[i]).ToString("x");  
    }  
}  

//UNICODE字符转为中文  

string str = "//u4e2d//u6587";  
string outStr = "";  
if (!string.IsNullOrEmpty(str))  
{  
    string[] strlist = str.Replace("//","").Split('u');  
    try  
    {  
        for (int i = 1; i &lt; strlist.Length; i++)  
        {  
            //将unicode字符转为10进制整数,然后转为char中文字符  
            outStr += (char)int.Parse(strlist[i], System.Globalization.NumberStyles.HexNumber);  
        }  
    }  
    catch (FormatException ex)  
    {  
        outStr = ex.Message;  
    }  
}  


http://blog.csdn.net/liehuo123/article/details/6055285

.net连接 mysql数据库以及 增删改查基本操作

直接甩干货 控制台应用程序

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Data;
using MySql.Data.MySqlClient;
namespace ConsoleApplication3
{
    class Program
    {
        private static MySqlConnection connectDataBase()
        {
            string str = "Server=12*.11*.2*.*;User ID=*u*h*ng;Password=y*u*h*ng**;Database=yo*s*a*g;CharSet=utf8;convert zero datetime=True;";
            MySqlConnection conn = new MySqlConnection(str);
            return conn;
        }//end connectDataBase()

        static void Main(string[] args)
        {
            // Connect to the master database and create the sample database
            using (MySqlConnection conn = connectDataBase())
            {
                conn.Open();

                //查询
                using (MySqlCommand querySingleInfo = conn.CreateCommand())
                {
                    querySingleInfo.CommandText = "select business_category from multi_config where id=1 ";
                    using (MySqlDataReader reader = querySingleInfo.ExecuteReader())
                    {
                        // Loop over the results 
                        while (reader.Read())
                        {
                            Console.WriteLine(reader["business_category"].ToString().Trim());
                          //  Console.ReadKey();
                        }
                    }
                }

                ///更新  添加  删除
                using (MySqlCommand myCommand = conn.CreateCommand())
                {
                    myCommand.Connection = conn;
                    myCommand.CommandText = "update multi_config set service_status=-1 where id=10";
                    int ans = myCommand.ExecuteNonQuery();
                    Console.WriteLine(ans);
                    Console.ReadKey();
                }
            }

        }//end Main()

    }//end class Program

}


 

windows server 2008 安装windows服务

在 win 10 系统开发的windows service 程序,但需要应用在windows server 系统上,安装的时候提示找不到installutil.exe安装工具,导致无法安装window 服务。原因是server 系统中的.net Framework 版本太低,只是v.2。查询到以下两个较为使用的解决方案:

  1. nssm.exe工具 以安装nginx为例

    1. 下载nginx windows版本http://nginx.org/
    2. 下载 nssm :http://nssm.cc/
    3. 安装
      Nginx下载解压到一个目录,nssm下载后解压相应版本(32/64)到一个目录。
      然后安装服务:

      nssm install N1 “D:\N1\nginx.exe” `


    4. 即可安装成功最基本的服务,不过启动的是nssm,让后由nssm启动nginx。现在就可以通过控制面板->管理员工具->服务中找到该服务,并启动和停止了。当然,net start 和 net stop也是可以的。
      但是,当停止服务后,会发现网站仍在正常运转。查看进程会发现还有一个nginx进程存在。原来,nginx启动了两个nginx进程(根据nginx.conf的配置worker_processes 1;),一个监控进程,一个工作进程。显然,停止的是监控进程,而工作进程没停,结果就是nginx仍在运行。因此彻底关闭nginx就需要别的手段,如任务管理器或者使用taskkill命令:
      taskkill /F /IM nginx.exe > nul
      当然,可以写一个脚本来处理nginx停止的所有操作:

      @echo off
      echo Stopping nginx service...
      net stop N1
      echo Kill nginx process...
      taskkill /F /IM nginx.exe &gt; nul

    5. 想删除服务:

      sc delete Nginx

    6. 卸载服务:

      `nssm remove nginx
    7. 异常情况

      1.  <pre>Service not starting - Error 3</pre>
      
              1.  原因 :服务指向的地址为nssm的安装位置, 修改地址即可
      
          2.  1053
      
              1.  原因太多:(bug\超时\ .net Framework b版本)建议更新 .net Framework  版本
      
      1. 注意:需要在注册表中通过ImagePath修改可服务执行文件的位置
  2. 更新 .net Framework

    1. 下载 https://www.microsoft.com/en-us/download/details.aspx?id=53344
    2. 点击 安装 按钮
    3. 安装成功
    4. 检查情况 位置 C:\Windows\Microsoft.NET\Framework v.4.0.30319
      参考
  3. http://stackoverflow.com/questions/25241560/windows-process-activation-service-not-starting-error-3

  4. http://www.cnblogs.com/itcomputer/p/6216038.html
  5. http://www.cnblogs.com/ChineseMoonGod/p/5575715.html

如何调试Windows Service

安装成功后需要手动开启服务,因为我们刚设置 serviceInstaller1.StartType 为 Manual
打开windows 服务管理器,找到名为 Service1 的服务,右键属性。点击【启动】按钮

 

windows 调试
1 回到开发环境,选择调试->附加到进程,勾选”显示所有用户进程“
2 找到 WindowsService1.exe 进程(如果没有点击下刷新按钮),选中后点击“附加到进程”按钮。
3 选中 Service1.cs 文件,后按 F7 打开代码视图
4 在所有 str 变量上添加调试断点
5 回到windows服务管理器,找 Service1 服务并选中它,在左侧有一个“暂停”按钮。点击一下
这时,OnPause 方法下的断点命中!OK 达到了调试的目的了

 

注册成功后,启动 Windows服务 时遇到错误:1083 的解决办法
1.查看 Main() 方法中是否启动了指定的服务
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
new Service1(),
new Service2() //如果建立多个服务需要添加这段代码
};
ServiceBase.Run(ServicesToRun);

2.确保 ProjectInstaller.cs 视图设计器中的 serviceInstaller1 组件的 ServiceName 属性
与 Service1.cs 组件的 ServiceName 属性一致


添加服务安装成功后自启动功能

1.打开 ProjectInstaller.cs 视图设计器,选中 serviceInstaller1 组件

2.打开 serviceInstaller1 组件的事件窗口,双击 AfterInstall 事件

3.在 serviceInstaller1_AfterInstall 事件方法下添加如下代码

System.ServiceProcess.ServiceController sc = new System.ServiceProcess.ServiceController();
sc.ServiceName = “ExpressDispatchingTrack”; //必须与 ProjectInstaller.cs 视图设计器中的 serviceInstaller1 组件的 ServiceName 属性
一致
sc.Start();

 

 

 

参考http://blog.csdn.net/xxj_jing/article/details/7542654

Windows Service服务程序开发

Windows服务:Microsoft Windows 服务(即,以前的 NT服务)使您能够创建在它们自己的 Windows 会话中可长时间运行的可执行应用程序。这些服务可以在计算机启动时自动启动,可以暂停和重新启动而且不显示任何用户界面。这使服务非常适合在服务器上使用,或任何时候,为了不影响在同一台计算机上工作的其他用户,需要长时间运行功能时使用。还可以在不同于登录用户的特定用户帐户或默认计算机帐户的安全上下文中运行服务。(摘自百度百科)

 

一:创建

二:属性

VS自动创建了一个Service1.cs的文件:

点击F4,查看各个属性的含义:

Autolog 是否自动写入系统的日志文件

CanHandlePowerEvent 服务时候接受电源事件

CanPauseAndContinue 服务是否接受暂停或继续运行的请求

CanShutdown 服务是否在运行它的计算机关闭时收到通知,以便能够调用 OnShutDown 过程

CanStop 服务是否接受停止运行的请求

ServiceName 服务名称

三:功能

点击F7查看Service1.cs的源代码:

默认实现了OnStart和OnStop两个方法。

以向一个文本文件中写入数据操作为例:

复制代码

   public partial class Service1 : ServiceBase
{
public Service1()
{
InitializeComponent();
}

    /// &lt;summary&gt;
    /// 服务启动
    /// http://www.cnblogs.com/babycool
    /// &lt;/summary&gt;
    /// &lt;param name="args"&gt;&lt;/param&gt;
    protected override void OnStart(string[] args)
    {
        string start = string.Format("{0}-{1}",DateTime.Now.ToString("yyyyMMddHHmmss"),"程序启动了。");
        Log(start);
    }

    /// &lt;summary&gt;
    /// 服务停止
    /// http://www.cnblogs.com/babycool
    /// &lt;/summary&gt;
    protected override void OnStop()
    {
        string start = string.Format("{0}-{1}", DateTime.Now.ToString("yyyyMMddHHmmss"), "程序停止了。");
        Log(start);
    }

    /// &lt;summary&gt;
    /// 系统关闭
    /// http://www.cnblogs.com/babycool
    /// &lt;/summary&gt;
    protected override void OnShutdown()
    {
        string start = string.Format("{0}-{1}", DateTime.Now.ToString("yyyyMMddHHmmss"), "电脑关闭了。");
        Log(start);
    }

    /*
    /// &lt;summary&gt;
    /// 服务暂停
    /// http://www.cnblogs.com/babycool
    /// &lt;/summary&gt;
    protected override void OnPause()
    {

    }
    */

    /*
    /// &lt;summary&gt;
    /// 服务继续
    /// &lt;/summary&gt;
    protected override void OnContinue()
    {
        base.OnContinue();
    }
    */
    /*
    /// &lt;summary&gt;
    /// 系统电源状态改变
    /// &lt;/summary&gt;
    /// &lt;param name="powerStatus"&gt;&lt;/param&gt;
    /// &lt;returns&gt;&lt;/returns&gt;
    protected override bool OnPowerEvent(PowerBroadcastStatus powerStatus)
    {
        return base.OnPowerEvent(powerStatus);
    }
    */

    void Log(string str)
    {
        string path = "E://def/6.txt";
        using (StreamWriter sw = File.AppendText(path))
        {
            sw.WriteLine(str);
        }
    }

}</pre>

复制代码


四:安装程序

切换到 Service1.cs[设计] 界面,右击选择“添加安装程序”。

这时项目中就添加了一个新类 ProjectInstaller 和两个安装组件 ServiceProcessInstaller 和 ServiceInstaller。

选中“serviceInstaller1” 控件,F4打开属性面板,

Description 服务程序的描述信息

DisplayName 服务程序显示的名称

StartType 指定如何启动服务

Manual 服务安装后,必须手动启动

Automatic 每次计算机重新启动时,服务都会自动启动

Disabled 服务无法启动

 

选中“serviceProcessInstaller1” 控件,F4打开属性面板:

 

将serviceProcessInstaller类的Account属性改为 LocalSystem。

这样,不论是以哪个用户登录的系统,服务总会启动。

五:生成

右击 项目 选择生成 ,不能通过F5来直接运行服务项目。

 

六:安装卸载服务

选择 VS组件 “Visual Studio命令提示(2010)” 工具,并以“管理员身份运行”(win7、win8系统下)。

注意:这里必须选择“以管理员身份运行”,否则会报错。

从命令行运行 Installutil.exe 目录 命令,以项目中的已编译可执行文件所在的目录作为参数,安装服务:

因为Installutil.exe程序默认在Windows\System32\目录下,需要通过cmd命令 “cd” 切换目录。

从命令行运行 Installutil.exe /u 目录 命令来卸载服务:

安装服务:
installutil.exe E:\XTestDemo\X_15_WindowsService\bin\Debug\X_15_WindowsService.exe

卸载服务:
installutil.exe /u E:\XTestDemo\X_15_WindowsService\bin\Debug\X_15_WindowsService.exe

七:查看服务状态

在“计算机管理”中,服务 下可以看到刚刚安装的Service服务(cmd命令:services.msc—本地服务设置):

默认是停止状态。右击,选择“启动”,即可开启服务。

通过“属性”,可以查看到更详细的信息。

 

转载请注明出处。

相关参考:

用C#创建Windows服务(Windows Services) - Gsun - 博客园

C#开发Windows Services服务–服务安装失败的解决办法 - 无名小虾 - 博客园

C#应用服务器!包括(消息服务器,更新服务器,应用服务器)

|