月度归档:2017年01月

c# socket tcp协议应用之HTTP协议(c# web服务器开发)


一、http协议简介

http协议规定:发送请求方:需要提供以下格式的数据给服务器:
1.1.1 请求行 加上 (\r\n)
1.1.2 请求头 加上 (\r\n)
1.1.3 请求体 加上 (\r\n)
服务方:
1.2.1 状态行 加上 (\r\n)
1.2.2 状态头 加上 (\r\n)
1.2.3 换行符号 (\r\n)
1.2.4 内容 加上 (\r\n)


状态行:通常包含 http协议版本 和http状态信息(例:200 404 500 等状态编码)
状态头:包含内容长度 内容编码
内容 :返回html内容


二、 c# socket web service 应用举例

 需引用命名空间:
 using System.Net; 
using System.Net.Sockets;
 代码:
        #region  socket对外web服务器
            Socket newSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            int recv;
            byte[] data = new byte[4096];
            IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 9008);

            newSock.Bind(ipep);
            newSock.Listen(10);



            while (true)
            {
                Socket tmpSocket = newSock.Accept();

                try
                {
                    //接收客户端消息
                    byte[] t = new byte[2048];
                    int tmpInt = tmpSocket.Receive(t);
                    //Console.WriteLine("共接收到字节数{0}", tmpInt);
                    //Console.WriteLine("接收内容:{0}", Encoding.ASCII.GetString(t).Trim());
                    //当数据接收完毕后,关闭此客户端连接
                    string htmlBody= "<html><head><title>test</title></head><body><h1>this is test web service:"+System.Guid.NewGuid().ToString()+"<h1></body></html>";
                    tmpSocket.Send(Encoding.ASCII.GetBytes("HTTP/1.1 200 OK\r\n"));
                    tmpSocket.Send(Encoding.ASCII.GetBytes("Content-Type:text/html;charset=UTF-8\r\nContent-Length:" + htmlBody.Length + "\r\n"));
                    tmpSocket.Send(Encoding.ASCII.GetBytes("\r\n"));
                    tmpSocket.Send(Encoding.ASCII.GetBytes(htmlBody+ "!\r\n"));
                    tmpSocket.Close();

                }
                catch (Exception e)
                {
                    Console.WriteLine("异常信息:" + e.ToString());
                }

            }



            #endregion

相关阅读:
c# socket tcp 协议应用
Socket简介

c# socket 方式操作redis


一、c# socket 操作redis思路简介

1.1 c# 申明一个socket连接 ,向redis发起连接
1.2 c# 将需要发送的命令按照“redis接收命令协议格式”进行拆解
1.3 c# 将拆解后的命令字符串发送至redis服务器
1.4 c# 接收redis服务器返回的字符串信息,根据协议格式拆分命令信息
1.5 c# 关闭当前对redis连接


二、c# socket 操作redis举例说明

           
	    #region 采用socket的方式操作redis

            Console.WriteLine("开始执行!");
            //1 socket 连接redis
            IPAddress serviceIP = IPAddress.Parse("192.168.8.123");
            IPEndPoint serviceEndPoint = new IPEndPoint(serviceIP, 6379);

            Socket t = new Socket(AddressFamily.InterNetwork,
            SocketType.Stream, ProtocolType.Tcp);

            try
            {
                t.Connect(serviceEndPoint);
                Console.WriteLine("连接成功!");
            }
            catch(Exception e)
            {
                Console.WriteLine(e.ToString());
                Console.ReadLine();
                return;
            }

            //2 socket 发送消息至redis
            try
            {
                t.Send(Encoding.ASCII.GetBytes("*3\r\n$3\r\nset\r\n$1\r\nk\r\n$1\r\nv\r\n"));
            }
            catch (Exception e)
            {
                Console.WriteLine("输出发送消息异常信息!");
                Console.WriteLine(e.ToString());

            }

            //3 socket从redis服务器接收消息
            byte[] rece = new byte[1024];
            t.Receive(rece);
            Console.WriteLine("返回结果信息!");
            Console.WriteLine(Encoding.ASCII.GetString(rece).Trim());

            #endregion

 

相关阅读:
redis 接收命令协议格式详解
c# socket tcp 协议应用
window redis 文件夹文件说明 (二) —[ redis-cli]
window redis 文件夹文件说明 (一 )
Redis 数据类型简介
windows下 Redis配置
c# redis应用实例
redis相关简介
KV数据库简介

redis 接收命令协议格式详解


一、redis命令格式详解

redis从socket端口接收到的信息,
以行为单位进行命令接收和解析 处理;
每行都有一个消息标头 (表示消息的用途);
每行命令都使用 \r\n 结束此行消息的输入。

redis接收和返回的消息常见消息头如下五种格式:
+: 此消息头表示当前消息是一个正确的状态,后面跟上相应的字符信息,常用于redis服务器返回消息
-: 此消息头表示返回一个错误信息,后面跟上相应的错误信息,常用于redis服务器返回消息
*: 表示一个整体的消息集合拥有多少行消息,不包含此消息行,常用于发送命令至redis服务器
&: 表示下一行消息的数据长度,提出消息头和行结束标志,常用于发送命令至redis服务器
:: 表示返回一个数值,常用于redis服务器返回消息
以上是redis的消息头,加上相关命令和数据 和 \r\n 结尾就可以组成一个redis可以接收的消息包。


二、redis命令格式举例使用

2.1 举例发送一个 set keyId keyValue 命令,设置一个键”keyId” 的键值为 keyValue,
我们通过以上的消息头可以将其转换为以下的消息块

  *3 \r\n \\表示消息块 一共有三行
  $3\r\n   \\表示以下消息由三个字符组成
  set \r\n  \\消息一
  $5\r\n    \\表示以下消息由五个字符组成
  keyId\r\n  \\消息二 
  $8\r\n     \\表示以下消息由八个字符组成
  keyValue\r\n \\消息三


返回消息: 如果成功,返回以下消息 +Ok\r\n 如果失败,返回一下消息 -err:错误内容\r\n

2.2 例 执行一个 hmset操作一个 hash键
hmset hashKeyId k1 v1 k2 v2 k3 v3

  //此命令包含8个消息行 每一个消息中的字符分别为  5 9 2 2 2 2 2 2
  转换为redis可接收的消息应该为以下格式:
  *8\r\n
  $5\r\n
  hmset\r\n
  &9\r\n
  hashKeyId\r\n
  &2\r\n
  k1\r\n
  &2\r\n
  v1\r\n
  &2\r\n
  k2\r\n
  &2\r\n
  v2\r\n
  &2\r\n
  k3\r\n
  &2\r\n
  v3\r\n

  

返回消息: 如果成功,返回以下消息 +Ok\r\n 如果失败,返回一下消息 -err:错误内容\r\n

依次类型,我们可以将通过redis-cli发送的命令,都转换为此文本,然后发送至redis运行,得到相应的返回结果。

相关阅读:
window redis 文件夹文件说明 (二) —[ redis-cli]
window redis 文件夹文件说明 (一 )
Redis 数据类型简介
windows下 Redis配置
c# redis应用实例
redis相关简介
KV数据库简介