`
isiqi
  • 浏览: 16050271 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

C#网络编程初探

阅读更多
导读:
  我们知道C#和C++的差异之一,就是他本身没有类库,所使用的类库是.Net框架中的类库--.Net FrameWork SDK。在.Net FrameWork SDK中为网络编程提供了二个名称空间:"System.Net"和"System.Net.Sockets"。C#就是通过这二个名称空间中封装的类和方法实现网络通讯的。
  首先我们解释一下在网络编程时候,经常遇到的几个概念:同步(synchronous)、异步(asynchronous)、阻塞(Block)和非阻塞(Unblock):
  所谓同步方式,就是发送方发送数据包以后,不等接受方响应,就接着发送下一个数据包。异步方式就是当发送方发送一个数据包以后,一直等到接受方响应后,才接着发送下一个数据包。而阻塞套接字是指执行此套接字的网络调用时,直到调用成功才返回,否则此套节字就一直阻塞在网络调用上,比如调用StreamReader 类的Readlin ( )方法读取网络缓冲区中的数据,如果调用的时候没有数据到达,那么此Readlin ( )方法将一直挂在调用上,直到读到一些数据,此函数调用才返回;而非阻塞套接字是指在执行此套接字的网络调用时,不管是否执行成功,都立即返回。同样调用StreamReader 类的Readlin ( )方法读取网络缓冲区中数据,不管是否读到数据都立即返回,而不会一直挂在此函数调用上。在Windows网络通信软件开发中,最为常用的方法就是异步非阻塞套接字。平常所说的C/S(客户端/服务器)结构的软件采用的方式就是异步非阻塞模式的。
  其实在用C#进行网络编程中,我们并不需要了解什么同步、异步、阻塞和非阻塞的原理和工作机制,因为在.Net FrameWrok SDK中已经已经把这些机制给封装好了。下面我们就用C#开一个具体的网络程序来说明一下问题。
  一.本文中介绍的程序设计及运行环境
  (1).微软视窗2000 服务器版
  (2)..Net Framework SDK Beta 2以上版本
  二.服务器端程序设计的关键步骤以及解决办法:
  在下面接受的程序中,我们采用的是异步阻塞的方式。
  (1).首先要要在给定的端口上面创建一个"tcpListener"对象侦听网络上面的请求。当接收到连结请求后通过调用"tcpListener"对象的"AcceptSocket"方法产生一个用于处理接入连接请求的Socket的实例。下面是具体实现代码:
  //创建一个tcpListener对象,此对象主要是对给定端口进行侦听
  tcpListener = new TcpListener ( 1234 ) ;
  //开始侦听
  tcpListener.Start ( ) ;
  //返回可以用以处理连接的Socket实例
  socketForClient = tcpListener.AcceptSocket ( ) ;
  (2).接受和发送客户端数据:
  此时Socket实例已经产生,如果网络上有请求,在请求通过以后,Socket实例构造一个"NetworkStream"对象,"NetworkStream"对象为网络访问提供了基础数据流。我们通过名称空间"System.IO"中封装的二个类"StreamReader"和"StreamWriter"来实现对"NetworkStream"对象的访问。其中"StreamReader"类中的ReadLine ( )方法就是从"NetworkStream"对象中读取一行字符;"StreamWriter"类中的WriteLine ( )方法就是对"NetworkStream"对象中写入一行字符串。从而实现在网络上面传输字符串,下面是具体的实现代码:
  try
  {
  //如果返回值是"true",则产生的套节字已经接受来自远方的连接请求
  if ( socketForClient.Connected )
  {
  ListBox1.Items.Add ( "已经和客户端成功连接!" ) ;
  while ( true )
  {
  //创建networkStream对象通过网络套节字来接受和发送数据
  networkStream = new NetworkStream ( socketForClient ) ;
  //从当前数据流中读取一行字符,返回值是字符串
  streamReader = new StreamReader ( networkStream ) ;
  string msg = streamReader.ReadLine ( ) ;
  ListBox1.Items.Add ( "收到客户端信息:" + msg ) ;
  streamWriter = new StreamWriter ( networkStream ) ;
  if ( textBox1.Text != "" )
  {
  ListBox1.Items.Add ( "往客户端反馈信息:" + textBox1.Text ) ;
  //往当前的数据流中写入一行字符串
  streamWriter.WriteLine ( textBox1.Text ) ;
  //刷新当前数据流中的数据
  streamWriter.Flush ( ) ;
  }
  }
  }
  }
  catch ( Exception ey )
  {
  MessageBox.Show ( ey.ToString ( ) ) ;
  }
  (3).最后别忘了要关闭所以流,停止侦听网络,关闭套节字,具体如下:
  //关闭线程和流
  networkStream.Close ( ) ;
  streamReader.Close ( ) ;
  streamWriter.Close ( ) ;
  _thread1.Abort ( ) ;
  tcpListener.Stop ( ) ;
  socketForClient.Shutdown ( SocketShutdown.Both ) ;
  socketForClient.Close ( ) ;
  三.C#网络编程服务器端程序的部分源代码(server.cs)
  由于在此次程序中我们采用的结构是异步阻塞方式,所以在实际的程序中,为了不影响服务器端程序的运行速度,我们在程序中设计了一个线程,使得对网络请求侦听,接受和发送数据都在线程中处理,请在下面的代码中注意这一点,下面是server.cs的完整代码:
  using System ;
  using System.Drawing ;
  using System.Collections ;
  using System.ComponentModel ;
  using System.Windows.Forms ;
  using System.Data ;

本文转自
http://study.qqcf.com/web/224/23985.htm
分享到:
评论

相关推荐

    C#网络编程初探[参照].pdf

    C#网络编程初探[参照].pdf

    C#网络编程初探(PDF格式)

    C#网络编程初探,介绍了C#网络编程的一些应用,包括套接字,TCP和UDP的连接等等。

    C#网络编程C#网络编程初探

    在.Net FrameWork SDK中为网络编程提供了二个名称空间:"System.Net"和"System.Net.Sockets"。C#就是通过这二个名称空间中封装的类和方法实现网络通讯的。  首先我们解释一下在网络编程时候,经常遇到的几个概念...

    c#网络编程初探

    详细讲解c#网络编程。针对socket的UDP、TCP开发相对基础的内容

    C#网络编程初探.pdf

    C#和C++的差异之一,就是他本身没有类库,所使用的类库...在.Net FrameWork SDK中为网络编程提供了二个名称空间:"System.Net"和"System.Net.Sockets"。C#就是通过这二个名称空间中封装的类和方法实现网络通讯的。

    C #网络编程初探适应网络开发人员

    C#网络编程初探C#网络编程初探C#网络编程初探

    C#GHI+编程初探.pdf

    C#是微软Visual Studio.he%的重要妇成部分。在C# 推出的同时,出现l『很多诸如名字空间、wfn Fcmr~∞I+ 和dR等新概念、新机制 本文就向大家介绍一下C#下∞I+ 编程的—些基本知识 GDI+是从GDI演化而来的,但是在...

    C# 2.0 套接字编程实例初探.pdf

    首先从原理上解释一下采用Socket接口的网络通讯,这里以最常用的C/S模式作为范例,首先,服务端有一个进程(或多个进程)在指定的端口等待客户来连接,服务程序等待客户的连接信息,一旦连接上之后,就可以按设计的...

    《初探 C# 2.0》PPT和演示代码

    大连.Net俱乐部首次活动,《初探 C# 2.0》PPT和演示代码,主要介绍了:泛型编程(用具体的测试数字比较了泛型编程和非泛型编程)、迭代器、空属类型、局部类型、匿名方法、静态类、属性访问的保护级别;感觉还不错,讲的...

    C#基础系列:异步编程初探async和await

    确实,没有异步的多线程是单调的、乏味的,async和await是出现在C#5.0之后,它的出现给了异步并行变成带来了很大的方便。异步编程涉及到的东西还是比较多,本篇还是先介绍下async和await的原理及简单实现。  了解...

    C#开发实战宝典.(清华出版.王小科等).part1

     全书共分30章,主要内容包括初探C#及其开发环境,认识C#代码结构,C#程序设计基础,选择结构控制,循环结构控制,字符及字符串,数组、集合与哈希表,面向对象程序设计,Windows窗体设计,Windows应用程序常用控件...

    c#开发实战宝典 明日科技 源代码

    对话框、菜单、工具栏及状态栏,数据库编程基础,ADO.NET数据访问技术,DataGridView数据控件,面向对象编程高级技术,枚举类型与泛型,LINQ技术的使用,文件及I/O,GDI+绘图技术,水晶报表与打印,网络编程,线程的...

    C#开发实战宝典.(清华出版.王小科等).part2

     全书共分30章,主要内容包括初探C#及其开发环境,认识C#代码结构,C#程序设计基础,选择结构控制,循环结构控制,字符及字符串,数组、集合与哈希表,面向对象程序设计,Windows窗体设计,Windows应用程序常用控件...

    c#经典读物:C#经典范例50讲

    初学c#的最好读物,集合源码与方法于一书. C#中接口(interface)的理解.... 20 C# 2.0 套接字编程实例初探. 06 Word文档中快速插入分隔线的技巧. 11 C# 4.0语言将出现重大改变,带来一段Code. 11 C# 3.0新特性初步研究

    ASP.NET常见问题集锦.zip

    C#编程规范.doc C#语言参考.doc Code.doc C#中的“装箱”与“拆箱”.txt Datagrid分页、排序、删除代码.txt DataList分页、增加、删除、修改实例.doc is as override示例.txt JA_ASP lecture_UML MS ...

    asp.net知识库

    多样式星期名字转换 [Design, C#] .NET关于string转换的一个小Bug Regular Expressions 完整的在.net后台执行javascript脚本集合 ASP.NET 中的正则表达式 常用的匹配正则表达式和实例 经典正则表达式 delegate vs. ...

    亮剑.NET深入体验与实战精要.part4(完)

     第4章 windows窗体编程你也行  第5章 数据库开发  第6章 关于xml  第7章 web service开发详解  第8章 用户体验的杀手锏——ajax  第9章 系统与文件操作  第10章 网络应用开发  第11章 windows ...

    亮剑.NET深入体验与实战精要.part3

     第4章 windows窗体编程你也行  第5章 数据库开发  第6章 关于xml  第7章 web service开发详解  第8章 用户体验的杀手锏——ajax  第9章 系统与文件操作  第10章 网络应用开发  第11章 windows ...

    亮剑.NET:.NET深入体验与实战精要清晰版及源码

     第4章 windows窗体编程你也行  第5章 数据库开发  第6章 关于xml  第7章 web service开发详解  第8章 用户体验的杀手锏——ajax  第9章 系统与文件操作  第10章 网络应用开发  第11章 windows ...

Global site tag (gtag.js) - Google Analytics