zoukankan      html  css  js  c++  java
  • C#.Net Socket网络通讯编程

    <!-- /* Font Definitions */ @font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimSun; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} @font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-1610611985 1107304683 0 0 159 0;} @font-face {font-family:楷体_GB2312; panose-1:2 1 6 9 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:1 135135232 16 0 262144 0;} @font-face {font-family:"/@宋体"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} @font-face {font-family:"/@楷体_GB2312"; panose-1:2 1 6 9 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:1 135135232 16 0 262144 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; mso-pagination:none; font-size:10.5pt; mso-bidi-font-size:12.0pt; font-family:"Times New Roman","serif"; mso-fareast-font-family:宋体; mso-font-kerning:1.0pt;} .MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-size:10.0pt; mso-ansi-font-size:10.0pt; mso-bidi-font-size:10.0pt; mso-ascii-font-family:"Times New Roman"; mso-fareast-font-family:宋体; mso-hansi-font-family:"Times New Roman"; mso-font-kerning:0pt;} /* Page Definitions */ @page {mso-page-border-surround-header:no; mso-page-border-surround-footer:no;} @page Section1 {size:595.3pt 841.9pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:42.55pt; mso-footer-margin:49.6pt; mso-paper-source:0; layout-grid:15.6pt;} div.Section1 {page:Section1;} -->

    C#.Net Socket 网络通讯编程

    1 、理解socket
    1) Socket 接口是TCP/IP 网络的应用程序接口(API )。Socket 接口定义了许多函数和例程,程序员可以用它们来开发TCP/IP 网络应用程序。Socket 可以看成是网络通信上的一个端点,也就是说,网络通信包括两台主机或两个进程,通过网络传递它们之间的数据。为了进行网络通信,程序在网络对话的每一端都需要一个Socket

    2) TCP/IP 传输层使用协议端口将数据传送给一台主机的特定应用程序,从网络的观点看,协议端口是一个应用程序的进程地址。当传输层模块的网络软件模块要与另一个程序通信时,它将使用协议端口。Socket 是运行在传输层的API ,所以在使用Socket 建立连接发送数据时,要指定一个端口给它。

    3) 根据通信性质的不同,可以把Socket 分成3 类:
    Stream socket (流套接字):该类Socket 提供双向、有序、无重复的数据流服务,它使用于处理大量网络数据;
    Dgram Socket (数据报套接字):该类Socket 支持双向的数据流,但不保证数据传输的可靠性、有序性和无重复性,也就是说一个从Dgram Socket 接收信息的进程,有可能发现信息重复或和发出时顺序不同的情况;
    Raw Socket (原始套接字):该类 Socket 可以访问底层的协议。

    4) 使用Socket 接口进行网络通信的过程如图5-1 所示,简要步骤如下:
    建立一个socket
    按要求配置socket ,即将socket 连接到远程主机或给socket 指定一个本地协议端口;
    按要求通过socket 发送和接收数据;
    关闭此socket

    2 C# 编程要点
    根据上述的步骤,使用C# 设计通过Socket 实现点对点通信的程序需要掌握4 个编程要点:socket 的构造、socket 的配置和连接、数据的发送和接收、socket 的关闭。

    1) 、命名空间的添加
    using System.Net;
    using System.Net.Socket; //
    用于操纵Socket

    2) 、构造一个新的socket 对象
    C# 中,采用socket 函数构造一个socket 对象,socket 函数原型如下:
    public Socket (AddressFamily addressFamily, SocketType socketType, ProtocolType protocolType);

    AddressFamily
    成员指定socket 用来解析地址的寻址方案。例如,InterNetwork 表示需要一个IP 版本4 的地址,InterNetworkV6 表示IP 版本6 的地址。

    SocketType
    参数指定Socket 的类型。例如,Raw 支持对基础传输协议的访问,Stream 支持可靠、双向、基于连接的数据流。

    ProtocolType
    指定Socket 类支持的协议。例如,IP 表示网际协议,TCP 表示传输控制协议。
    注意 3 个参数不是独立的,有些地址族会限制可与其一起使用的协议,并且套接字类型在协议中通常是隐式的。如果地址族、套接字类型和协议类型不匹配将导致无效的Socket

    例如,构造一个新的Socket 对象,采用IP 版本4 的地址,支持可靠、双向、基于连接的数据流,采用TCP 协议:
    Socket sock=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp)

    3) Socket 的配置和连接
    为了将Socket 和主机关联,必须将主机表示成网络端点的形式。在C# 中,采用IPEndPoint 类表示网络端点,IPEndPoint 函数原型如下:
    public IPEndPoint IPAddress address,int port
    参数:address 表示IP 地址,port 表示提供服务的端口号。
    在服务器端将构造socket 对象与表示服务器的网络端点绑定,然后开始进行监听,在收到连接请求后建立连接。

    主要用语以下3 个函数:BindListenAccept
    函数原型如下:
    public void Bind(EndPoint localEP)
    参数localEP 为与socket 关联的网络端点。

    public void Listen(int backlog)
    参数backlog 为挂连接队列的最大长度

    public Socket Accept()
    返回值为socket ,用于处理接收的连接请求。

    :构造一个服务器的网络端点,对socket 进行绑定,开始监听,接受连接请求。

    IPAddress ServerIP=IPAdress.Parse("192.18.16.186"); // 设定服务器IP 地址
    IPEndPoint Server=new IPEndPoint(ServerIP,8866); //
    生成服务器网络端点
    Socket Sock=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp) //
    构造一个socket
    Sock.Bind(Server); //
    socket 和服务器绑定
    Sock.Listen(8); //
    开始监听,允许连接队列的长度为8
    Socket connectsock=sock.Accept(); //
    返回socket ,用于同连接请求的socket 通信


    客户端向服务器端发出连接请求,用到Connect 函数,Connect 函数原型如下:
    public Connect(EndPoint remoteEP)
    参数:remoteEP 表示要连接的服务器端点。例如向服务器端发出连接请求,服务器IPServerIP ,端口为Port
    IPEndPoint Server=new IPEndPoint(ServerIP,Port); //
    定义要连接的服务器端点
    Sock=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp) //
    构造一个socket
    Sock.Connect(Server); //
    与服务器连接

    4) 、数据的传送和接收
    使用两个用于传送和接收数据的函数:SendReceive 。函数原型如下:
    public int Send(byte[] buffer,int size,SocketFlag socketFlags)
    参数:buffer 表示要发送的数据;size 表示要发送数据的大小;socketFlags 提供Socket 消息的常数值,具有允许按位组合其成员值的属性。
    返回值为发送到socket 的字节数。

    public int Receive(byte[] buffer,int size,SocketFlage socketFlags)
    参数:buffer 表示接收到的数据的存储位置;size 表示要接收数据的大小;socketFlags 提供Socket 消息的常数值,具有允许按位组合其成员值的属性。
    返回值为接收到socket 的字节数。

    :接收来自客户端的数据,同时将该数据返回到客户端。Socket 是前面例子中定义和设置好的。

    public static string data=null; // 定义字符串变量存放接收到的信息
    bytes=new byte[1024];
    int bytesRec=connectsock.Receive(bytes,bytes.Lentgh,0); //
    接受来自客户端的数据
    Console.WriteLine("Text received:{0}",bytes); //
    显示接收到的数据
    connectsock.Send(bytes,bytes.Length,0); //
    发送数据到客户端

    5) socket 的关闭
    socket 关闭之前,要确保已经发送和接收完所有挂起的数据,因此在关闭socket 之前,要先调用Shutdown ,函数原型如下:
    public void Shutdown(SocketShutdown how)
    参数:SocketShutdown 指定不再允许的操作。成员名称:Both 禁止socket 发送和接收;Receive 禁止socket 接收数据;Send 禁止socket 发送数据。

    采用close 函数强制关闭Socket 连接。函数原型如下:
    public void clsoe()
    当该套接字被关闭时,Connected 属性将被设置为false

     

  • 相关阅读:
    接口报错mixed content blocked
    重拾单片机
    部署ajax服务-支持jsonp
    linkageSystem--串口通信、socket.io
    node安装问题
    jshint之对!的检验
    node之websocket
    调试node服务器-过程
    oracle取某字符串字段的后4位
    vmware 共享文件夹
  • 原文地址:https://www.cnblogs.com/cpcpc/p/2123114.html
Copyright © 2011-2022 走看看