标签归档:socket网络

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 tcp 协议应用


一、socket tcp使用流程简介

服务端:
1.1.1 申明ip地址
1.1.2 申明端口
1.1.3 申明socket对象,并指定socket类型及指定协议使用tcp
1.1.4 绑定ip及端口至socket对象上
1.1.5 启动监听
1.1.6 申明临时socket 接收客户端连接
1.1.7 向1.1.6上发送数据
1.1.8 从1.1.6上接收数据,数据接收完毕后关闭1.1.6的连接

客户端:
1.2.1 申明待连接的ip地址
1.2.2 申明socket对象,并指定socket类型及指定协议使用tcp
1.2.3 绑定ip地址至socket对象上
1.2.4 通过socket对象连接指定的ip地址和端口
1.2.5 接收数据
1.2.6 发送数据
1.2.7 关闭连接

 

二、socket tcp使用举例说明

服务端代码:

      #region  TCP 对外服务

            int recv;
            byte[] data = new byte[1024];
            IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 9008);
            Socket newSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream,ProtocolType.Tcp);
            newSock.Bind(ipep);
            newSock.Listen(100);
             
            while(true)
            {
                Socket tmpSocket = newSock.Accept();
                tmpSocket.Send(Encoding.ASCII.GetBytes("this is server send message!"));

                while (true)
                {
                    try
                    {
                        //接收客户端消息
                        byte[] t = new byte[20];
                        int tmpInt = tmpSocket.Receive(t);
                        Console.WriteLine("共接收到字节数{0}", tmpInt);
                        Console.WriteLine("接收内容:{0}", Encoding.ASCII.GetString(t).Trim());
                        //当数据接收完毕后,关闭此客户端连接
			if (tmpInt == 0)
                        {
                            tmpSocket.Shutdown(SocketShutdown.Both);
                            tmpSocket.Close();
                            break;
                        }
                    }
                    catch
                    {
                        
                        tmpSocket.Shutdown(SocketShutdown.Both);
                        tmpSocket.Close();
                        break;
                    }
                 }
                
            }
            

            #endregion

 

客户端代码:

        #region tcp 客户端

                IPAddress serverIP = IPAddress.Parse("127.0.0.1");
                IPEndPoint serverIPEndPoint = new IPEndPoint(serverIP, 9008);
                Socket t = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                try
                {
                    t.Connect(serverIPEndPoint);
                    Console.WriteLine("连接成功!");
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.ToString());
                    return;
                }

                byte[] receiveInfo = new byte[1024];
                int receiveLength = t.Receive(receiveInfo);
                Console.WriteLine("接收服务器消息的长度:{0}", receiveLength);
                Console.WriteLine("接收消息内容:{0}", Encoding.ASCII.GetString(receiveInfo).Trim());
 
                for (int i = 0; i < 2000; i++)
                {  
                    Console.WriteLine("发送数据{0}", i.ToString());
                    try
                    {
                       // Thread.Sleep(1000);
                        t.Send(Encoding.ASCII.GetBytes("test"+i.ToString()+System.Guid.NewGuid().ToString()));

                    }
                    catch (Exception e)
                    {
                         Console.WriteLine("异常:{0}", e.ToString());                       
                    }

              


                } 
                t.Shutdown(SocketShutdown.Both);
                t.Close();
                Console.WriteLine("数据发送完毕!,按任意键退出!");
                Console.ReadLine();



                //连接服务器


                #endregion

 

相关阅读:
c# socket SocketType枚举简介
c# socket 应用(一) UDP
Socket简介

c# socket SocketType枚举简介


SocketType枚举简介

在c# socket应用开发中 ,我们需要先初始化一个socket对象,如下:

  Socket newSock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram,ProtocolType.Tcp);

这里我们需要指定socket对外的地址类型,和地址类型 协议类型相匹配的socket类型,
下文将主要介绍socket类型

1.1 Unknown类型
未知socket类型


1.2 Stream
支持可靠、双向、基于连接的字节流,而不重复数据,也不保留边界。
此类型的 Socket 与单个对方主机进行通信,并且在通信开始之前需要远程主机连接。
需要同protocoltype.tcp类型 一起使用。


1.3 Dgram
支持数据报,即最大长度固定(通常很小)的无连接、不可靠消息。
消息可能会丢失或重复并可能在到达时不按顺序排列。
SocketType.Dgram 类型在发送和接收数据之前不需要任何连接,可以同时同多个主机进行连接通信,Dgram通常同UDp协议和addressFamily.InterNetwork一起初始化。


1.4 Raw
支持对基础传输协议的访问。
SocketType.Raw,可以使用Internet 控制消息协议 (ProtocolType.Icmp) 和 Internet 组管理协议 (ProtocolType.Igmp)进行通信。
在发送时,您的应用程序必须提供完整的 IP 标头。所接收的数据报在返回时会保持其 IP 标头和选项不变。


1.5 Rdm
支持无连接、面向消息、以可靠方式发送的消息,并保留数据中的消息边界。
RDM(以可靠方式发送的消息)消息会依次到达,不会重复。此外,如果消息丢失,将会通知发送方。
使用SocketType.Rdm 初始化 Socket,则在发送和接收数据之前无需建立远程主机连接。
使用SocketType.Rdm,可以与多个对方主机进行通信。


1.6 Seqpacket
在网络上提供排序字节流的面向连接且可靠的双向传输。
SocketType.Seqpacket 不重复数据,它在数据流中保留边界。SocketType.Seqpacket
类型的 Socket 与单个对方主机通信,在通信开始之前需要建立远程主机连接。


相关阅读:
c# socket 应用(一) UDP
Socket简介