精华内容
下载资源
问答
  • c#socket

    2008-06-20 09:39:10
    c#socket编程代码
  • C#socket C#socket

    2018-12-14 17:58:59
    C#socket TCP是面向连接的通信,所以在通信之前,客户端与服务器端必须通过三次握手建立连接,然后在通信完毕,还要通过四次挥手断开连接
  • c# Socket

    2012-02-02 18:10:00
    深入探析c# Socket Socket网络编程学习笔记(1):常用方法介绍 Socket网络编程学习笔记(2):面向连接的Socket Socket网络编程学习笔记(3):利用套接字助手类 Socket网络编程学习笔记(4):TCP消息边界...

    深入探析c# Socket

     

    Socket网络编程学习笔记(1):常用方法介绍
    Socket网络编程学习笔记(2):面向连接的Socket
    Socket网络编程学习笔记(3):利用套接字助手类
    Socket网络编程学习笔记(4):TCP消息边界处理
    Socket网络编程学习笔记(5):发送和接收实体类数据
    Socket网络编程学习笔记(6):使用线程池提高性能

     

     .NET Socket开发之异步Socket

    .NET平台下几种SOCKET模型的简要性能供参考

    在C#中实现Socket端口复用

    c#编写高性能Tcp Socket应用注意事项

     (一)Socket服务器整体架构概述

    Socket 死连接详解

    [译]C# Socket连接请求超时机制

    C#.net同步异步SOCKET通讯和多线程总结(转)

    C#中判断socket是否已断开的方法

    Socket开发探秘--数据封包和拆包

    Socket的select模型

     Socket连接的小知识,和一个疑难杂症

    经过一年时间的沉淀 再次回首 TCP Socket服务器编程 (二)

    Socket与拔掉网线

    深入探索Socket

    高性能Socket设计实现

    为什么服务端的socket要调用Accept创建新的socket

    初识socket网络编程接口

     

     关于socket中的accept()函数

    关于.net socket性能问题。

    深入讨论.NET Socket的Accept方法

    c# socket 编程——对常用的网络操作进行封装

    http和socket简介

    关于C#的异步Socket问题

    .net中的socket异步通信实现--服务器端代码

    [传智播客学习日记]Socket类的用法

     

    你得学会并且学得会的Socket编程基础知识(转)

    C# 判断socket断开(转)

     

     

    http://zzk.cnblogs.com/s?w=Socket&p=42

     

     

    由于目标机器积极拒绝,无法连接。 192.168.1.15:8989

     

     

     

     

     

     

     

     

     

     

    转载于:https://www.cnblogs.com/tengguo/archive/2012/02/02/2336106.html

    展开全文
  • c# socket

    2011-06-24 17:48:00
    c# socket2009年05月31日 星期日 17:49Microsoft.Net Framework为应用程序访问Internet提供了分层的、可扩展的以及受管辖的网络服务,其名字空间System.Net和System.Net.Sockets包含丰富的类可以开发多种网络应用...
    c# socket
    2009年05月31日 星期日 17:49
    Microsoft.Net Framework为应用程序访问Internet提供了分层的、可扩展的以及受管辖的网络服务,其名字空间System.Net和System.Net.Sockets包含丰富的类可以开发多种网络应用程序。.Net类采用的分层结构允许应用程序在不同的控制级别上访问网络,开发人员可以根据需要选择针对不同的级别编制程序,这些级别几乎囊括了Internet的所有需要--从socket套接字到普通的请求/响应,更重要的是,这种分层是可以扩展的,能够适应Internet不断扩展的需要。
       
       抛开ISO/OSI模型的7层构架,单从TCP/IP模型上的逻辑层面上看,.Net类可以视为包含3个层次:请求/响应层、应用协议层、传输层。WebReqeust和WebResponse 代表了请求/响应层,支持Http、Tcp和Udp的类组成了应用协议层,而Socket类处于传输层。  
       
       传输层位于这个结构的最底层,当其上面的应用协议层和请求/响应层不能满足应用程序的特殊需要时,就需要使用这一层进行Socket套接字编程。
       
       而在.Net中,System.Net.Sockets 命名空间为需要严密控制网络访问的开发人员提供了 Windows Sockets (Winsock) 接口的托管实现。System.Net 命名空间中的所有其他网络访问类都建立在该套接字Socket实现之上,如TCPClient、TCPListener 和 UDPClient 类封装有关创建到 Internet 的 TCP 和 UDP 连接的详细信息;NetworkStream类则提供用于网络访问的基础数据流等,常见的许多Internet服务都可以见到Socket的踪影,如Telnet、Http、Email、Echo等,这些服务尽管通讯协议Protocol的定义不同,但是其基础的传输都是采用的Socket。
       
       其实,Socket可以象流Stream一样被视为一个数据通道,这个通道架设在应用程序端(客户端)和远程服务器端之间,而后,数据的读取(接收)和写入(发送)均针对这个通道来进行。
       
       可见,在应用程序端或者服务器端创建了Socket对象之后,就可以使用Send/SentTo方法将数据发送到连接的Socket,或者使用Receive/ReceiveFrom方法接收来自连接Socket的数据;
       
       针对Socket编程,.NET 框架的 Socket 类是 Winsock32 API 提供的套接字服务的托管代码版本。其中为实现网络编程提供了大量的方法,大多数情况下,Socket 类方法只是将数据封送到它们的本机 Win32 副本中并处理任何必要的安全检查。如果你熟悉Winsock API函数,那么用Socket类编写网络程序会非常容易,当然,如果你不曾接触过,也不会太困难,跟随下面的解说,你会发觉使用Socket类开发windows 网络应用程序原来有规可寻,它们在大多数情况下遵循大致相同的步骤。
       
       在使用之前,你需要首先创建Socket对象的实例,这可以通过Socket类的构造方法来实现:
       
       public Socket(AddressFamily addressFamily,SocketType socketType,ProtocolType protocolType);
       
       
       其中,addressFamily 参数指定 Socket 使用的寻址方案,socketType 参数指定 Socket 的类型,protocolType 参数指定 Socket 使用的协议。
       
       下面的示例语句创建一个 Socket,它可用于在基于 TCP/IP 的网络(如 Internet)上通讯。
       
       Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
       
       
       若要使用 UDP 而不是 TCP,需要更改协议类型,如下面的示例所示:
       
       Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
       
       
       一旦创建 Socket,在客户端,你将可以通过Connect方法连接到指定的服务器,并通过Send/SendTo方法向远程服务器发送数据,而后可以通过Receive/ReceiveFrom从服务端接收数据;而在服务器端,你需要使用Bind方法绑定所指定的接口使Socket与一个本地终结点相联,并通过Listen方法侦听该接口上的请求,当侦听到用户端的连接时,调用Accept完成连接的操作,创建新的Socket以处理传入的连接请求。使用完 Socket 后,记住使用 Shutdown 方法禁用 Socket,并使用 Close 方法关闭 Socket。其间用到的方法/函数有:
       
       Socket.Connect方法:建立到远程设备的连接
       public void Connect(EndPoint remoteEP)(有重载方法)
       Socket.Send 方法:从数据中的指示位置开始将数据发送到连接的 Socket。
       public int Send(byte[], int, SocketFlags);(有重载方法)
       Socket.SendTo 方法 将数据发送到特定终结点。
       public int SendTo(byte[], EndPoint);(有重载方法)
       Socket.Receive方法:将数据从连接的 Socket 接收到接收缓冲区的特定位置。
       public int Receive(byte[],int,SocketFlags);
       Socket.ReceiveFrom方法:接收数据缓冲区中特定位置的数据并存储终结点。
       public int ReceiveFrom(byte[], int, SocketFlags, ref EndPoint);
       Socket.Bind 方法:使 Socket 与一个本地终结点相关联:
       public void Bind( EndPoint localEP );
       Socket.Listen方法:将 Socket 置于侦听状态。
       public void Listen( int backlog );
       Socket.Accept方法:创建新的 Socket 以处理传入的连接请求。
       public Socket Accept();
       Socket.Shutdown方法:禁用某 Socket 上的发送和接收
       public void Shutdown( SocketShutdown how );
       Socket.Close方法:强制 Socket 连接关闭
       public void Close();
       
       
       可以看出,以上许多方法包含EndPoint类型的参数,在Internet中,TCP/IP 使用一个网络地址和一个服务端口号来唯一标识设备。网络地址标识网络上的特定设备;端口号标识要连接到的该设备上的特定服务。网络地址和服务端口的组合称为终结点,在 .NET 框架中正是由 EndPoint 类表示这个终结点,它提供表示网络资源或服务的抽象,用以标志网络地址等信息。.Net同时也为每个受支持的地址族定义了 EndPoint 的子代;对于 IP 地址族,该类为 IPEndPoint。IPEndPoint 类包含应用程序连接到主机上的服务所需的主机和端口信息,通过组合服务的主机IP地址和端口号,IPEndPoint 类形成到服务的连接点。
       
       用到IPEndPoint类的时候就不可避免地涉及到计算机IP地址,.Net中有两种类可以得到IP地址实例:
       
       IPAddress类:IPAddress 类包含计算机在 IP 网络上的地址。其Parse方法可将 IP 地址字符串转换为 IPAddress 实例。下面的语句创建一个 IPAddress 实例:
       
       IPAddress myIP = IPAddress.Parse("192.168.1.2");
       
       
       Dns 类:向使用 TCP/IP Internet 服务的应用程序提供域名服务。其Resolve 方法查询 DNS 服务器以将用户友好的域名(如"host.contoso.com")映射到数字形式的 Internet 地址(如 192.168.1.1)。Resolve方法 返回一个 IPHostEnty 实例,该实例包含所请求名称的地址和别名的列表。大多数情况下,可以使用 AddressList 数组中返回的第一个地址。下面的代码获取一个 IPAddress 实例,该实例包含服务器 host.contoso.com 的 IP 地址。
       
       IPHostEntry ipHostInfo = Dns.Resolve("host.contoso.com");
       IPAddress ipAddress = ipHostInfo.AddressList[0];
       
       
       你也可以使用GetHostName方法得到IPHostEntry实例:
       
       IPHosntEntry hostInfo=Dns.GetHostByName("host.contoso.com")
       
       
       在使用以上方法时,你将可能需要处理以下几种异常:
       
       SocketException异常:访问Socket时操作系统发生错误引发
       
       ArgumentNullException异常:参数为空引用引发
       
       ObjectDisposedException异常:Socket已经关闭引发
       
       在掌握上面得知识后,下面的代码将该服务器主机( host.contoso.com的 IP 地址与端口号组合,以便为连接创建远程终结点:
       
       IPEndPoint ipe = new IPEndPoint(ipAddress,11000);
       
       
       确定了远程设备的地址并选择了用于连接的端口后,应用程序可以尝试建立与远程设备的连接。下面的示例使用现有的 IPEndPoint 实例与远程设备连接,并捕获可能引发的异常:
       
       try {
        s.Connect(ipe);//尝试连接
       }
       //处理参数为空引用异常
        catch(ArgumentNullException ae) {
        Console.WriteLine("ArgumentNullException : {0}", ae.ToString());
       }
       //处理操作系统异常
        catch(SocketException se) {
        Console.WriteLine("SocketException : {0}", se.ToString());
       }
        catch(Exception e) {
        Console.WriteLine("Unexpected exception : {0}", e.ToString());
       }
       
       
       需要知道的是:Socket 类支持两种基本模式:同步和异步。其区别在于:在同步模式中,对执行网络操作的函数(如 Send 和 Receive)的调用一直等到操作完成后才将控制返回给调用程序。在异步模式中,这些调用立即返回。
       
       另外,很多时候,Socket编程视情况不同需要在客户端和服务器端分别予以实现,在客户端编制应用程序向服务端指定端口发送请求,同时编制服务端应用程序处理该请求,这个过程在上面的阐述中已经提及;当然,并非所有的Socket编程都需要你严格编写这两端程序;视应用情况不同,你可以在客户端构造出请求字符串,服务器相应端口捕获这个请求,交由其公用服务程序进行处理。以下事例语句中的字符串就向远程主机提出页面请求:
       
       string Get = "GET / HTTP/1.1/r/nHost: " + server + "/r/nConnection: Close/r/n/r/n";
       
       
       远程主机指定端口接受到这一请求后,就可利用其公用服务程序进行处理而不需要另行编制服务器端应用程序。
       
       综合运用以上阐述的使用Visual C#进行Socket网络程序开发的知识,下面的程序段完整地实现了Web页面下载功能。用户只需在窗体上输入远程主机名(Dns 主机名或以点分隔的四部分表示法格式的 IP 地址)和预保存的本地文件名,并利用专门提供Http服务的80端口,就可以获取远程主机页面并保存在本地机指定文件中。如果保存格式是.htm格式,你就可以在Internet浏览器中打开该页面。适当添加代码,你甚至可以实现一个简单的浏览器程序。
       
       
       实现此功能的主要源代码如下:
       
       //"开始"按钮事件
       private void button1_Click(object sender, System.EventArgs e) {
        //取得预保存的文件名
        string fileName=textBox3.Text.Trim();
        //远程主机
        string hostName=textBox1.Text.Trim();
        //端口
        int port=Int32.Parse(textBox2.Text.Trim());
        //得到主机信息
        IPHostEntry ipInfo=Dns.GetHostByName(hostName);
        //取得IPAddress[]
        IPAddress[] ipAddr=ipInfo.AddressList;
        //得到ip
        IPAddress ip=ipAddr[0];
        //组合出远程终结点
        IPEndPoint hostEP=new IPEndPoint(ip,port);
        //创建Socket 实例
        Socket socket=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
        try
        {
        //尝试连接
        socket.Connect(hostEP);
        }
        catch(Exception se)
        {
        MessageBox.Show("连接错误"+se.Message,"提示信息
        ,MessageBoxButtons.RetryCancel,MessageBoxIcon.Information);
       }
       //发送给远程主机的请求内容串
       string sendStr="GET / HTTP/1.1/r/nHost: " + hostName +
       "/r/nConnection: Close/r/n/r/n";
        //创建bytes字节数组以转换发送串
        byte[] bytesSendStr=new byte[1024];
        //将发送内容字符串转换成字节byte数组
        bytesSendStr=Encoding.ASCII.GetBytes(sendStr);
       try
       {
       //向主机发送请求
       socket.Send(bytesSendStr,bytesSendStr.Length,0);
       }
       catch(Exception ce)
        {
        MessageBox.Show("发送错误:"+ce.Message,"提示信息
        ,MessageBoxButtons.RetryCancel,MessageBoxIcon.Information);
        }
        //声明接收返回内容的字符串
        string recvStr="";
        //声明字节数组,一次接收数据的长度为1024字节
        byte[] recvBytes=new byte[1024];
        //返回实际接收内容的字节数
        int bytes=0;
       //循环读取,直到接收完所有数据
       while(true)
       {
       bytes=socket.Receive(recvBytes,recvBytes.Length,0);
       //读取完成后退出循环
       if(bytes〈=0)
       break;
       //将读取的字节数转换为字符串
       recvStr+=Encoding.ASCII.GetString(recvBytes,0,bytes);
       }
       //将所读取的字符串转换为字节数组
       byte[] content=Encoding.ASCII.GetBytes(recvStr);
        try
        {
        //创建文件流对象实例
        FileStream fs=new FileStream(fileName,FileMode.OpenOrCreate,FileAccess.ReadWrite);
       //写入文件
       fs.Write(content,0,content.Length);
       }
       catch(Exception fe)
        {
        MessageBox.Show("文件创建/写入错误:"+fe.Message,"提示信息",MessageBoxButtons.RetryCancel,MessageBoxIcon.Information);
        }
        //禁用Socket
        socket.Shutdown(SocketShutdown.Both);
        //关闭Socket
        socket.Close();
        }
        }
       
       
       程序在WindowsXP中文版、.Net Frameworkd 中文正式版、Visual Studio.Net中文正式版下调试通过
       
       
       
       关于作者
       
       宋华,96年毕业于承德石油学院电子与电气系计算机应用专业,同年进入中国石油天然气集团公司吐哈油田工作,一直从事网络规划与建设、网站架构与设计,现专门从事Internet应用程序开发及Windows应用程序开发。


    Visual C#.Net网络程序开发-Tcp篇

    前一篇《Visual C#.Net网络程序开发-Socket篇》中说到:支持Http、Tcp和Udp的类组成了TCP/IP三层模型(请求响应层、应用协议层、传输层)的中间层-应用协议层,该层的类比位于最底层的Socket类提供了更高层次的抽象,它们封装 TCP 和 UDP 套接字的创建,不需要处理连接的细节,这使得我们在编写套接字级别的协议时,可以更多地尝试使用 TCPClient 、 UDPClient和TcpListener,而不是直接向 Socket 中写。它们之间的这种层次关系示意如下:
       
       可见, TcpClient 类基于 Socket 类构建,这是它能够以更高的抽象程度提供 TCP 服务的基础。正因为这样,许多应用层上的通讯协议,比如FTP(File Transfers Protocol)文件传输协议、HTTP(Hypertext Transfers Protocol)超文本传输协议等都直接创建在TcpClient等类之上。
       
       TCPClient 类使用 TCP 从 Internet 资源请求数据。TCP 协议建立与远程终结点的连接,然后使用此连接发送和接收数据包。TCP 负责确保将数据包发送到终结点并在数据包到达时以正确的顺序对其进行组合。
       
       从名字上就可以看出,TcpClient类专为客户端设计,它为 TCP 网络服务提供客户端连接。TcpClient 提供了通过网络连接、发送和接收数据的简单方法。
       
       若要建立 TCP 连接,必须知道承载所需服务的网络设备的地址(IPAddress)以及该服务用于通讯的 TCP 端口 (Port)。Internet 分配号码机构 (Internet Assigned Numbers Authority, IANA) 定义公共服务的端口号(你可以访问 http://www.iana.org/assignments/port-numbers获得这方面更详细的资料)。IANA 列表中所没有的服务可使用 1,024 到 65,535 这一范围中的端口号。要创建这种连接,你可以选用TcpClient类的三种构造函数之一:
       
       1、public TcpClient()当使用这种不带任何参数的构造函数时,将使用本机默认的ip地址并将使用默认的通信端口号0。这样情况下,如果本机不止一个ip地址,将无法选择使用。以下语句示例了如何使用默认构造函数来创建新的 TcpClient:
       
       TcpClient tcpClientC = new TcpClient();
       
       
       2、public TcpClient(IPEndPoint)使用本机IPEndPoint创建TcpClient的实例对象。上一篇介绍过了,IPEndPoint将网络端点表示为IP地址和端口号,在这里它用于指定在建立远程主机连接时所使用的本地网络接口(IP 地址)和端口号,这个构造方法为使用本机IPAddress和Port提供了选择余地。下面的语句示例了如何使用本地终结点创建 TcpClient 类的实例:
       
       IPHostEntry ipInfo=Dns.GetHostByName("www.tuha.net");//主机信息
        IPAddressList[] ipList=ipInfo.AddressList;//IP地址数组
        IPAddress ip=ipList[0];//多IP地址时一般用第一个
        IPEndPoint ipEP=new IPEndPoint(ip,4088);//得到网络终结点
        try{
        TcpClient tcpClientA = new TcpClient(ipLocalEndPoint);
        }
       catch (Exception e ) {
        Console.WriteLine(e.ToString());
        }
       
       
       到这里,你可能会感到困惑,客户端要和服务端创建连接,所指定的IP地址及通信端口号应该是远程服务器的呀!事实上的确如此,使用以上两种构造函数,你所实现的只是TcpClient实例对象与IP地址和Port端口的绑定,要完成连接,你还需要显式指定与远程主机的连接,这可以通过TcpClient类的Connect方法来实现, Connet方法使用指定的主机名和端口号将客户端连接到 远程主机:
       
       1)、public void Connect(IPEndPoint); 使用指定的远程网络终结点将客户端连接到远程 TCP 主机。
       
       public void Connect(IPAddress, int); 使用指定的 IP 地址和端口号将客户端连接到 TCP 主机。
       
       public void Connect(string, int); 将客户端连接到指定主机上的指定端口。
       
       需要指出的是,Connect方法的所有重载形式中的参数IPEndPoint网络终
       
       结点、IPAddress以及表现为string的Dns主机名和int指出的Port端口均指的是远程服务器。
       
       以下示例语句使用主机默认IP和Port端口号0与远程主机建立连接:
       
       TcpClient tcpClient = new TcpClient();//创建TcpClient对象实例
        try{
        tcpClient.Connect("www.contoso.com",11002);//建立连接
        }
        catch (Exception e ){
        Console.WriteLine(e.ToString());
        }
       
       
       3、public TcpClient(string, int);初始化 TcpClient 类的新实例并连接到指定主机上的指定端口。与前两个构造函数不一样,这个构造函数将自动建立连接,你不再需要额外调用Connect方法,其中string类型的参数表示远程主机的Dns名,如:www.tuha.net。
       
       以下示例语句调用这一方法实现与指定主机名和端口号的主机相连:
       
       try{
        TcpClient tcpClientB = new TcpClient("www.tuha.net", 4088);
        }
        catch (Exception e ) {
        Console.WriteLine(e.ToString());
        }
       前面我们说,TcpClient类创建在Socket之上,在Tcp服务方面提供了更高层次的抽象,体现在网络数据的发送和接受方面,是TcpClient使用标准的Stream流处理技术,使得它读写数据更加方便直观,同时,.Net框架负责提供更丰富的结构来处理流,贯穿于整个.Net框架中的流具有更广泛的兼容性,构建在更一般化的流操作上的通用方法使我们不再需要困惑于文件的实际内容(HTML、XML 或其他任何内容),应用程序都将使用一致的方法(Stream.Write、Stream.Read) 发送和接收数据。另外,流在数据从 Internet 下载的过程中提供对数据的即时访问,可以在部分数据到达时立即开始处理,而不需要等待应用程序下载完整个数据集。.Net中通过NetworkStream类实现了这些处理技术。
       
       NetworkStream 类包含在.Net框架的System.Net.Sockets 命名空间里,该类专门提供用于网络访问的基础数据流。NetworkStream 实现通过网络套接字发送和接收数据的标准.Net 框架流机制。NetworkStream 支持对网络数据流的同步和异步访问。NetworkStream 从 Stream 继承,后者提供了一组丰富的用于方便网络通讯的方法和属性。
       
       同其它继承自抽象基类Stream的所有流一样,NetworkStream网络流也可以被视为一个数据通道,架设在数据来源端(客户Client)和接收端(服务Server)之间,而后的数据读取及写入均针对这个通道来进行。
       
       .Net框架中,NetworkStream流支持两方面的操作:
       
       1、 写入流。写入是从数据结构到流的数据传输。
       
       2、读取流。读取是从流到数据结构(如字节数组)的数据传输。
       
       与普通流Stream不同的是,网络流没有当前位置的统一概念,因此不支持查找和对数据流的随机访问。相应属性CanSeek 始终返回 false,而 Seek 和 Position 方法也将引发 NotSupportedException。
       
       基于Socket上的应用协议方面,你可以通过以下两种方式获取NetworkStream网络数据流:
       
       1、使用NetworkStream构造函数:public NetworkStream(Socket, FileAccess, bool);(有重载方法),它用指定的访问权限和指定的 Socket 所属权为指定的 Socket 创建 NetworkStream 类的新实例,使用前你需要创建Socket对象实例,并通过Socket.Connect方法建立与远程服务端的连接,而后才可以使用该方法得到网络传输流。示例如下:
       
       Socket s=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);//创建客户端Socket对象实例
        try{
        s.Connect("www.tuha.net",4088);//建立与远程主机的连接
        }
        catch(Exception e){
        MessageBox.show("连接错误:" +e.Message);
        }
        try{
        NetworkStream stream=new NetworkStream(s,FileAccess.ReadWrite,false);//取得网络传输流
        }
       
       
       2、通过TcpClient.GetStream方法:public NetworkStream etStream();它返回用于发送和接收数据的基础网络流NetworkStream。GetStream 通过将基础 Socket 用作它的构造函数参数来创建 NetworkStream 类的实例。使用前你需要先创TcpClient对象实例并建立与远程主机的连接,示例如下:
       
       TcpClient tcpClient = new TcpClient();//创建TcpClient对象实例
        Try{
        tcpClient.Connect("www.tuha.net",4088);//尝试与远程主机相连
        }
        catch(Exception e){
        MessageBox.Show("连接错误:"+e.Message);
        }
        try{
        NetworkStream stream=tcpClient.GetStream();//获取网络传输流
        }
        catch(Exception e)
        {
        MessageBox.Show("TcpClient错误:"+e.Message);
        }
       
       
       通过以上方法得到NetworkStream网络流之后,你就可以使用标准流读写方法Write和Read来发送和接受数据了。
       
       以上是.Net下使用TcpClient类实现客户端编程的技术资料,为了向客户端提供这些服务,我们还需要编制相应的服务端程序,前一篇《Visual C#.Net网络程序开发-Socket篇》上曾经提到, Socket作为其他网络协议的基础,既可以面向客户端开发,也可以面向服务端开发,在传输层面上使用较多,而在应用协议层面上,客户端我们采用构建于Socket类之上的TcpClient取代Socket;相应地,构建于Socket之上的TcpListener提供了更高理念级别的 TCP 服务,使得我们能更方便地编写服务端应用程序。正是因为这样的原因,像FTP 和 HTTP 这样的应用层协议都是在 TcpListener 类的基础上建立的。
       
       .Net中的TCPListener 用于监视TCP 端口上的传入请求,通过绑定本机IP地址和相应端口(这两者应与客户端的请求一致)创建TcpListener对象实例,并由Start方法启动侦听;当TcpListener侦听到用户端的连接后,视客户端的不同请求方式,通过AcceptTcpClient 方法接受传入的连接请求并创建 TcpClient 以处理请求,或者通过AcceptSocket 方法接受传入的连接请求并创建 Socket 以处理请求。最后,你需要使用 Stop 关闭用于侦听传入连接的 Socket,你必须也关闭从 AcceptSocket 或 AcceptTcpClient 返回的任何实例。这个过程详细解说如下:
       
       首先,创建TcpListener对象实例,这通过TcpListener类的构造方法来实现:
       
       public TcpListener(port);//指定本机端口
       public TcpListener(IPEndPoint)//指定本机终结点
       public TcpListener(IPAddress,port)//指定本机IP地址及端口
       
       
       以上方法中的参数在前面多次提到,这里不再细述,唯一需要提醒的是,这些参数均针对服务端主机。下面的示例演示创建 TcpListener 类的实例:
       
       IPHostEntry ipInfo=Dns.Resolve("127.0.0.1");//主机信息
        IPAddressList[] ipList=ipInfo.IPAddressList;//IP数组
        IPAddress ip=ipList[0];//IP
        try{
        TcpListener tcpListener = new TcpListener(ipAddress, 4088);//创建TcpListener对象实例以侦听用户端连接
        }
        catch ( Exception e){
        MessageBox.Show("TcpListener错误:"+e.Message);
        }
       
       
       随后,你需要调用Start方法启动侦听:
       
       public void Start();
       
       
       其次,当侦听到有用户端连接时,需要接受挂起的连接请求,这通过调用以下两方法之一来完成连接:
       
       public Socket AcceptSocket();
       public TcpClient AcceptTcpClient();
       
       
       前一个方法返回代表客户端的Socket对象,随后可以通过Socket 类的 Send 和 Receive 方法与远程计算机通讯;后一个方法返回代表客户端的TcpClient对象,随后使用上面介绍的 TcpClient.GetStream 方法获取 TcpClient 的基础网络流 NetworkStream,并使用流读写Read/Write方法与远程计算机通讯。
       
       最后,请记住关闭侦听器:public void Stop();
       
       同时关闭其他连接实例:public void Close();
       
       下面的示例完整体现了上面的过程:
       
       bool done = false;
        TcpListener listener = new TcpListener(13);// 创建TcpListener对象实例(13号端口提供时间服务)
        listener.Start();//启动侦听
        while (!done) {//进入无限循环以侦听用户连接
        TcpClient client = listener.AcceptTcpClient();//侦听到连接后创建客户端连接TcpClient
        NetworkStream ns = client.GetStream();//得到网络传输流
        byte[] byteTime = Encoding.ASCII.GetBytes(DateTime.Now.ToString());//预发送的内容(此为服务端时间)转换为字节数组以便写入流
        try {
        ns.Write(byteTime, 0, byteTime.Length);//写入流
        ns.Close();//关闭流
        client.Close();//关闭客户端连接
        }
       catch (Exception e) {
        MessageBox.Show("流错误:"+e.Message)
        }
             综合运用上面的知识,下面的实例实现了简单的网络通讯-双机互连,针对客户端和服务端分别编制了应用程序。客户端创建到服务端的连接,向远程主机发送连接请求连接信号,并发送交谈内容;远程主机端接收来自客户的连接,向客户端发回确认连接的信号,同时接收并显示客户端的交谈内容。在这个基础上,发挥你的创造力,你完全可以开发出一个基于程序语言(C#)级的聊天室!
       
       客户端主要源代码:
       
        public void SendMeg()//发送信息
        {
       try
       {
       
       
       int port=Int32.Parse(textBox3.Text.ToString());//远程主机端口
        try
        {
        tcpClient=new TcpClient(textBox1.Text,port);//创建TcpClient对象实例 }
        catch(Exception le)
        {
        MessageBox.Show("TcpClient Error:"+le.Message);
        }
       string strDateLine=DateTime.Now.ToShortDateString()+" "+DateTime.Now.ToLongTimeString();//得到发送时客户端时间
        netStream=tcpClient.GetStream();//得到网络流
        sw=new StreamWriter(netStream);//创建TextWriter,向流中写字符
        string words=textBox4.Text;//待发送的话
        string content=strDateLine+words;//待发送内容
        sw.Write(content);//写入流
        sw.Close();//关闭流写入器
        netStream.Close();//关闭网络流
        tcpClient.Close();//关闭客户端连接
       }
       catch(Exception ex)
        {
        MessageBox.Show("Sending Message Failed!"+ex.Message);
        }
        textBox4.Text="";//清空
        }
       
       
       服务器端主要源代码:
       
        public void StartListen()//侦听特定端口的用户请求
        {
       //ReceiveMeg();
       isLinked=false; //连接标志
        try
        {
        int port=Int32.Parse(textBox1.Text.ToString());//本地待侦听端口
        serverListener=new TcpListener(port);//创建TcpListener对象实例
        serverListener.Start(); //启动侦听
        }
        catch(Exception ex)
        {
        MessageBox.Show("Can‘t Start Server"+ex.Message);
        return;
        }
        isLinked=true;
        while(true)//进入无限循环等待用户端连接
        {
        try
        {
        tcpClient=serverListener.AcceptTcpClient();//创建客户端连接对象
        netStream=tcpClient.GetStream();//得到网络流
        sr=new StreamReader(netStream);//流读写器
        }
        catch(Exception re)
        {
        MessageBox.Show(re.Message);
        }
        string buffer="";
       string received="";
        received+=sr.ReadLine();//读流中一行
        while(received.Length!=0)
        {
        buffer+=received;
        buffer+="/r/n";
        //received="";
        received=sr.ReadLine();
        }
       listBox1.Items.Add(buffer);//显示
       //关闭
       sr.Close();
       netStream.Close();
       tcpClient.Close();
       }
       }  

     

    展开全文
  • 当前位置:我的异常网» C#»c# socket怎么传输大数据c# socket怎么传输大数据www.myexceptions.net网友分享于:2013-09-24浏览:130次c# socket如何传输大数据我服务端通过SOCKET向客户端发送大数据(M以上的数据),...

    当前位置:我的异常网» C# » c# socket怎么传输大数据

    c# socket怎么传输大数据

    www.myexceptions.net  网友分享于:2013-09-24  浏览:130次

    c# socket如何传输大数据

    我服务端通过SOCKET向客户端发送大数据(M以上的数据),数据大后,容易掉包,用多线程的话不掉包,但是速度又比较慢了。

    请教各位大神了!

    ------解决方案--------------------

    const int blockLength=512*1024;

    public void SendFile(string filePath, NetworkStream stream) //发送文件

    {

    //传输内容

    using (FileStream fs = File.Open(filePath, FileMode.Open))

    {

    int readLength = 0;

    byte[] data = new byte[blockLength];

    //发送大小

    byte[] length = new byte[8];

    BitConverter.GetBytes(new FileInfo(filePath).Length).CopyTo(length, 0);

    stream.Write(length, 0, 8);

    //发送文件

    while ((readLength = fs.Read(data, 0, blockLength)) > 0)

    {

    stream.Write(data, 0, readLength);

    }

    }

    }

    public bool ReceiveFile(string fileName, NetworkStream stream) //接收文件

    {

    try

    {

    long count = GetSize(stream);

    if (count == 0)

    {

    return false;

    }

    long index = 0;

    int currentBlockLength = 0;

    int receivedBytesLen = 1;

    using (FileStream fs = new FileStream(fileName, FileMode.OpenOrCreate))

    {

    while (receivedBytesLen > 0 && index < count)

    {

    byte[] clientData = new byte[blockLength];

    receivedBytesLen = 0;

    if (blockLength < count - index)

    {

    currentBlockLength = blockLength;

    }

    else

    {

    currentBlockLength = (int)(count - index);

    }

    receivedBytesLen = stream.Read(clientData, 0, currentBlockLength);

    fs.Write(clientData, 0, receivedBytesLen);

    index += receivedBytesLen;

    }

    }

    }

    catch(Exception ex)

    {

    MessageBox.Show(ex.Message);

    return false;

    }

    return true;

    }

    private int GetSize(NetworkStream stream) //获取文件大小

    {

    int count = 0;

    byte[] countBytes = new byte[8];

    try

    {

    if (stream.Read(countBytes, 0, 8) == 8)

    {

    count = BitConverter.ToInt32(countBytes, 0);

    }

    else

    {

    return 0;

    }

    }

    catch

    {

    return 0;

    }

    return count;

    }

    文章评论

    展开全文
  • C# socket

    2015-08-04 15:49:41
    我在客户端建立了一个SOCKET来监听服务器是否给它发送信息,代码如下 Socket socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPAddress ip = IPAddress.Parse...
  • c# socket模块

    2018-08-20 17:52:01
    c# socket模块
  • C# socket心跳

    热门讨论 2011-05-18 23:25:27
    C# socket心跳 C# socket心跳 C# socket心跳 C# socket心跳
  • C# Socket

    2012-08-14 17:51:33
    (看到这,肯定得来个转折的了,不然就看不到下文了,不是吗)但是,为了自己下一篇要写的文章做参考,还是有必要先补充一下socket基础知识。 注意:如果你已经接触过socket,那就没什么必要耽误时间看下去了。另外...
    看到这个题目,是不是很眼熟?在博客园里搜下,保证会发现关于这个东东的文章实在是太多了~~~真得是没有写得必要,而且我也有点懒得去琢磨字句。(看到这,肯定得来个转折的了,不然就看不到下文了,不是吗)但是,为了自己下一篇要写的文章做参考,还是有必要先补充一下socket基础知识。
    

    注意:如果你已经接触过socket,那就没什么必要耽误时间看下去了。另外,如果发现其中任何错误,欢迎直接指出。

    1.按惯例先来介绍下socket
    Windows中的很多东西都是从Unix领域借鉴过来的,Socket也是一样。在Unix中,socket代表了一种文件描述符(在Unix中一切都是以文件为单位),而这里这个描述符则是用于描述网络访问的。什么意思呢?就是程序员可以通过socket来发送和接收网络上的数据。你也可以理解成是一个API。有了它,你就不用直接去操作网卡了,而是通过这个接口,这样就省了很多复杂的操作。
    在C#中,MS为我们提供了 System.Net.Sockets 命名空间,里面包含了Socket类。

    2.有了socket,那就可以用它来访问网络了
    不过你不要高兴得太早,要想访问网络,还得有些基本的条件(和编程无关的我就不提了):a. 要确定本机的IP和端口,socket只有与某一IP和端口绑定,才能发挥强大的威力。b. 得有协议吧(否则谁认得你这发送到网络的是什么呀)。想要复杂的,我们可以自己来定协议。但是这个就不在这篇里提了,我这里介绍两种大家最熟悉不过的协议:TCP & UDP。(别说你不知道,不然...不然...我不告诉你)
    如果具备了基本的条件,就可以开始用它们访问网络了。来看看步骤吧:
    a. 建立一个套接字
    b. 绑定本机的IP和端口
    c. 如果是TCP,因为是面向连接的,所以要利用ListenO()方法来监听网络上是否有人给自己发东西;如果是UDP,因为是无连接的,所以来者不拒。
    d. TCP情况下,如果监听到一个连接,就可以使用accept来接收这个连接,然后就可以利用Send/Receive来执行操作了。而UDP,则不需要accept, 直接使用SendTo/ReceiveFrom来执行操作。(看清楚哦,和TCP的执行方法有区别,因为UDP不需要建立连接,所以在发送前并不知道对方的IP和端口,因此需要指定一个发送的节点才能进行正常的发送和接收)
    e. 如果你不想继续发送和接收了,就不要浪费资源了。能close的就close吧。
    如果看了上面文字,你还不清楚的话,就来看看图好了:

    面向连接的套接字系统调用时序

    无连接的套接字系统调用时序

    3.开始动手敲~~代码(简单的代码)
    首先我们来写个面向连接的

    using System;
    using System.Net;
    using System.Net.Sockets;
    using System.Text;
    
    namespace tcpserver
    {
        /// <summary>
        /// Class1 的摘要说明。
        /// </summary>
        class server
        {
            /// <summary>
            /// 应用程序的主入口点。
            /// </summary>
            [STAThread]
            static void Main(string[] args)
            {
                //
                // TODO: 在此处添加代码以启动应用程序
                //
                int recv;//用于表示客户端发送的信息长度
                byte[] data=new byte[1024];//用于缓存客户端所发送的信息,通过socket传递的信息必须为字节数组
                IPEndPoint ipep=new IPEndPoint(IPAddress.Any,9050);//本机预使用的IP和端口
                Socket newsock=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
                newsock.Bind(ipep);//绑定
                newsock.Listen(10);//监听
                Console.WriteLine("waiting for a client");
                Socket client=newsock.Accept();//当有可用的客户端连接尝试时执行,并返回一个新的socket,用于与客户端之间的通信
                IPEndPoint clientip=(IPEndPoint)client.RemoteEndPoint;
                Console.WriteLine("connect with client:"+clientip.Address+" at port:"+clientip.Port);
                string welcome="welcome here!";
                data=Encoding.ASCII.GetBytes(welcome);
                client.Send(data,data.Length,SocketFlags.None);//发送信息
                while(true)
                {//用死循环来不断的从客户端获取信息
                    data=new byte[1024];
                    recv=client.Receive(data);
                    Console.WriteLine("recv="+recv);
                    if (recv==0)//当信息长度为0,说明客户端连接断开
                        break;
                    Console.WriteLine(Encoding.ASCII.GetString(data,0,recv));
                    client.Send(data,recv,SocketFlags.None);
                }
                Console.WriteLine("Disconnected from"+clientip.Address);
                client.Close();
                newsock.Close();
    
            }
        }
    }

    using System;
    using System.Net;
    using System.Net.Sockets;
    using System.Text;

    namespace tcpclient
    {
    /// <summary>
    /// Class1 的摘要说明。
    /// </summary>
    class client
    {
    /// <summary>
    /// 应用程序的主入口点。
    /// </summary>
    [STAThread]
    static void Main(string[] args)
    {
    //
    // TODO: 在此处添加代码以启动应用程序
    //
    byte[] data=newbyte[1024];
    Socket newclient
    =new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
    Console.Write(
    "please input the server ip:");
    string ipadd=Console.ReadLine();
    Console.WriteLine();
    Console.Write(
    "please input the server port:");
    int port=Convert.ToInt32(Console.ReadLine());
    IPEndPoint ie
    =new IPEndPoint(IPAddress.Parse(ipadd),port);//服务器的IP和端口
    try
    {
    //因为客户端只是用来向特定的服务器发送信息,所以不需要绑定本机的IP和端口。不需要监听。
    newclient.Connect(ie);
    }
    catch(SocketException e)
    {
    Console.WriteLine(
    "unable to connect to server");
    Console.WriteLine(e.ToString());
    return;
    }
    int recv = newclient.Receive(data);
    string stringdata=Encoding.ASCII.GetString(data,0,recv);
    Console.WriteLine(stringdata);
    while(true)
    {
    string input=Console.ReadLine();
    if(input=="exit")
    break;
    newclient.Send(Encoding.ASCII.GetBytes(input));
    data
    =newbyte[1024];
    recv
    =newclient.Receive(data);
    stringdata
    =Encoding.ASCII.GetString(data,0,recv);
    Console.WriteLine(stringdata);
    }
    Console.WriteLine(
    "disconnect from sercer");
    newclient.Shutdown(SocketShutdown.Both);
    newclient.Close();

    }
    }
    }

    下面在给出无连接的(实在是太懒了,下面这个是直接复制别人的)

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Net;
    using System.Net.Sockets;
    namespace SimpleUdpSrvr
    {
    class Program
    {
    static void Main(string[] args)
    {
    int recv;
    byte[] data= newbyte[1024];
    IPEndPoint ipep
    =new IPEndPoint(IPAddress.Any,9050);//定义一网络端点
    Socket newsock =new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);//定义一个Socket
    newsock.Bind(ipep);//Socket与本地的一个终结点相关联
    Console.WriteLine("Waiting for a client..");

    IPEndPoint sender
    =new IPEndPoint(IPAddress.Any,0);//定义要发送的计算机的地址
    EndPoint Remote = (EndPoint)(sender);//
    recv = newsock.ReceiveFrom(data,ref Remote);//接受数据
    Console.WriteLine("Message received from{0}:", Remote.ToString());
    Console.WriteLine(Encoding.ASCII.GetBytes(data,
    0,recv));

    string welcome= "Welcome to my test server!";
    data
    = Encoding.ASCII.GetBytes(welcome);
    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);
    }
    }
    }
    }

     

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Net;
    using System.Net.Sockets;
    namespace SimpleUdpClient
    {
    class Program
    {
    static void Main(string[] args)
    {
    byte[] data= newbyte[1024];//定义一个数组用来做数据的缓冲区
    string input, stringData;
    IPEndPoint ipep
    =new IPEndPoint(IPAddress.Parse("127.0.0.1"),9050);
    Socket server
    =new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
    string welcome= "Hello,are you there?";
    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(
    "Message received from{0}:", Remote.ToString());
    Console.WriteLine(Encoding.ASCII.GetString(data,
    0, recv));
    while (true)//读取数据
    {
    input
    = Console.ReadLine();//从键盘读取数据
    if (input== "text")//结束标记
    {
    break;
    }
    server.SendTo(Encoding.ASCII.GetBytes(input), Remote);
    //将数据发送到指定的终结点Remote
    data =new byte[1024];
    recv
    = server.ReceiveFrom(data,ref Remote);//从Remote接受数据
    stringData = Encoding.ASCII.GetString(data,0, recv);
    Console.WriteLine(stringData);
    }
    Console.WriteLine(
    "Stopping client");
    server.Close();
    }
    }

     

    上面的示例只是简单的应用了socket来实现通信,你也可以实现异步socket、IP组播 等等。

    MS还为我们提供了几个助手类:TcpClient类、TcpListener类、UDPClient类。这几个类简化了一些操作,所以你也可以利用这几类来写上面的代码,但我个人还是比较习惯直接用socket来写。

    既然快写完了,那我就再多啰嗦几句。在需要即时响应的软件中,我个人更倾向使用UDP来实现通信,因为相比TCP来说,UDP占用更少的资源,且响应速度快,延时低。至于UDP的可靠性,则可以通过在应用层加以控制来满足。当然如果可靠性要求高的环境下,还是建议使用TCP。

     


    }

    展开全文
  • c# Socket实例

    2016-10-25 10:56:52
    c# Socket实例
  • C# SOCKET 通讯

    2011-07-21 14:04:39
    C# SOCKET通讯C# SOCKET通讯C# SOCKET通讯C# SOCKET通讯C# SOCKET通讯C# SOCKET通讯C# SOCKET通讯
  • c# socket 服务端

    2018-11-26 17:41:17
    c# socket 异步 服务端 能发送 多条指令 ,使用了异步框架
  • c# socket 通讯

    2016-11-24 20:29:06
    c# socket 通讯简单例子
  • C#SocketTcp 框架 Sockets 框架 中小项目直接引入 dll 就能使用此 socket 框架稳定可靠已优化和使用多年可实现各种复 杂连接 Client 端 c Server 端 s Json 为数据传送对象 框架的特点 1.方便简洁无需引入第三方 dll...
  • C#SOCKET通讯

    2015-04-13 09:40:22
    C#SOCKET通讯
  • c# socket 实例

    2011-05-12 11:02:21
    c# socket 实例c# socket 实例c# socket 实例
  • C# SocketDemo

    2014-10-28 08:44:21
    C# Socket通讯
  • C# Socket例程

    2014-09-15 13:47:51
    C# Socket例程
  • c# socket通讯.docx

    2021-03-24 23:51:45
    c# socket通讯.docx
  • c#Socket客户端断线重连! c#Socket客户端断线重连! c#Socket客户端断线重连! c#Socket客户端断线重连!
  • C# socket demo

    2012-11-18 16:15:17
    C# socket demo
  • C#socket聊天程序

    2018-06-06 14:20:57
    C#socket聊天程序 一个服务器端,多个客户端。c#的相关基础操作
  • C# Socket通讯

    2014-10-31 09:44:00
    用于C# socket的通讯,包含了客户端,服务器
  • C#Socket服务器

    2012-06-07 16:23:14
    C#Socket服务器
  • C# SOCKET通信基本流程图
  • C# Socket编程

    2012-04-03 15:19:53
    C# Socket编程
  • c#socket断开重连

    2017-11-08 12:26:39
    c#socket断开重新连接,以及循环接收数据,c#socket断开重新连接,以及循环接收数据,
  • C#Socket实例源码

    2018-07-25 17:00:59
    C#Socket简单实例,Winform小程序,服务端发送,客户端监听,适合初学者。
  • C# Socket客户端通讯

    2018-09-10 18:58:53
    C# SocketClient 与TPC/IP 协议通讯,里面包括二进制转换,编码转换,等技术

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,683
精华内容 4,273
关键字:

c#socket

c# 订阅