月度归档:2017年01月

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简介

c# socket 应用(一) UDP


一、socket 使用流程简介

1.1 服务端
1.1.1 申明ip地址端口 –可以指定任意ip 和 未使用的端口
1.1.2 申明socket类型
1.1.3 绑定ip地址至socket上
1.1.4 申明一个任意ip地址和端口
1.1.5 将1.1.4的地址转换为网络地址网络地址包含一个ip地址和一个端口信息
1.1.6 等待接收 1.1.3上的信息,并将接收信息的地址写入至 1.1.5的网络地址上

进入无限循环模式

1.1.7 申明一个空的网络地址
1.1.8 等待接收 1.1.3上的信息 ,并将接收信息的地址放入至 1.1.7网络地址中

将收到的信息回传给 1.1.7的网络地址上


从以上的规划,服务端拥有接收消息又发送消息的功能


1.2 客户端
1.2.1 申明指定的服务器ip地址和端口
1.2.2 申明socket类型
进入无限循环模式
{
1.2.3 读取一个键盘读取字符串
1.2.4 通过socket向1.2.1 地址发送消息
1.2.5 申明一个任意ip地址和端口
1.2.6 将1.2.4转换为网络地址网络地址包含一个ip地址和一个端口信息
1.2.7 等待接口信息,并将接收信息的地址写入至1.2.5的网络地址中

}
关闭服务器连接


二、socket 使用举例说明

服务器端代码:

    #region  UDP 对外服务

            int recv;
            byte[] data = new byte[1024];
            IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 9008);
            Socket newSock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram,ProtocolType.Udp);
            newSock.Bind(ipep);


            Console.WriteLine("等待客户端连接...");

            IPEndPoint sende = new IPEndPoint(IPAddress.Any, 0);
            EndPoint remote = (EndPoint)(sende);

            recv = newSock.ReceiveFrom(data, ref remote);

            Console.WriteLine("接收消息:{0}",remote.ToString());
            Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));

            string wecolme =" weclome service!";
            data = Encoding.ASCII.GetBytes(wecolme);
            newSock.SendTo(data,data.Length,SocketFlags.None,remote);


            while(true)
            {
               data = new byte[1024];
               recv = newSock.ReceiveFrom(data,ref remote);
               Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));
                newSock.SendTo(data,recv,SocketFlags.None,remote);
            }
            




            #endregion
 

客户端代码:

              byte[] data = new byte[1024];
            string input, stringData;
            IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9008);
            Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram,
                ProtocolType.Udp);
            string welcome = "hello---1";
            data = Encoding.ASCII.GetBytes(welcome);
            server.SendTo(data, data.Length, SocketFlags.None, ipep);

            IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
            EndPoint remote = (EndPoint)sender;
            data = new byte[1024];
            int recv = server.ReceiveFrom(data, ref remote);
            Console.WriteLine("开始接收消息{0}", remote.ToString());
            Console.WriteLine(Encoding.ASCII.GetString(data,0,recv));

            while (true)
            {
                input = Console.ReadLine();
                if(input =="exit")
                {
                    break;
                }

                server.SendTo(Encoding.ASCII.GetBytes(input),remote);
                data = new byte[1024];
                recv = server.ReceiveFrom(data, ref remote);
                stringData = Encoding.ASCII.GetString(data, 0, recv);
                Console.WriteLine(stringData);


            }

            Console.WriteLine("stop client");
            server.Close();

 

相关阅读:
Socket简介
socket网络