知识大全 C#网络编程初探

Posted

篇首语:最关情,折尽梅花,难寄相思。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 C#网络编程初探相关的知识,希望对你有一定的参考价值。

C#网络编程初探  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

我们知道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#开一个具体的网络程序来说明一下问题

  一.本文中介绍的程序设计及运行环境

   ( ) 微软视窗 服务器版

   ( ) Net Framework SDK Beta 以上版本

  二.服务器端程序设计的关键步骤以及解决办法

  在下面接受的程序中 我们采用的是异步阻塞的方式

  ( ) 首先要要在给定的端口上面创建一个 tcpListener 对象侦听网络上面的请求 当接收到连结请求后通过调用 tcpListener 对象的 AcceptSocket 方法产生一个用于处理接入连接请求的Socket的实例 下面是具体实现代码

//创建一个tcpListener对象 此对象主要是对给定端口进行侦听tcpListener = new TcpListener ( ) ;//开始侦听tcpListener Start ( ) ;//返回可以用以处理连接的Socket实例socketForClient = tcpListener AcceptSocket ( ) ;

  ( ) 接受和发送客户端数据

  此时Socket实例已经产生 如果网络上有请求 在请求通过以后 Socket实例构造一个 NeorkStream 对象 NeorkStream 对象为网络访问提供了基础数据流 我们通过名称空间 System IO 中封装的二个类 StreamReader 和 StreamWriter 来实现对 NeorkStream 对象的访问 其中 StreamReader 类中的ReadLine ( )方法就是从 NeorkStream 对象中读取一行字符 StreamWriter 类中的WriteLine ( )方法就是对 NeorkStream 对象中写入一行字符串 从而实现在网络上面传输字符串 下面是具体的实现代码

try//如果返回值是 true 则产生的套节字已经接受来自远方的连接请求if ( socketForClient Connected )ListBox Items Add ( 已经和客户端成功连接! ) ;while ( true )//创建neorkStream对象通过网络套节字来接受和发送数据neorkStream = new NeorkStream ( socketForClient ) ;//从当前数据流中读取一行字符 返回值是字符串streamReader = new StreamReader ( neorkStream ) ;string msg = streamReader ReadLine ( ) ;ListBox Items Add ( 收到客户端信息 + msg ) ;streamWriter = new StreamWriter ( neorkStream ) ;if ( textBox Text != )ListBox Items Add ( 往客户端反馈信息 + textBox Text ) ;//往当前的数据流中写入一行字符串streamWriter WriteLine ( textBox Text ) ;//刷新当前数据流中的数据streamWriter Flush ( ) ;catch ( Exception ey )MessageBox Show ( ey ToString ( ) ) ;

  ( ) 最后别忘了要关闭所以流 停止侦听网络 关闭套节字 具体如下

//关闭线程和流neorkStream Close ( ) ;streamReader Close ( ) ;streamWriter Close ( ) ;_thread 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 ;using System Net Sockets ;using System IO ;using System Threading ;using System Net ;//导入程序中使用到的名字空间public class Form : Formprivate ListBox ListBox ;private Button button ;private Label label ;private TextBox textBox ;private Button button ;private Socket socketForClient ;private NeorkStream neorkStream ;private TcpListener tcpListener ;private StreamWriter streamWriter ;private StreamReader streamReader ;private Thread _thread ;private System ComponentModel Container ponents = null ;public Form ( )InitializeComponent ( ) ;//清除程序中使用的各种资源protected override void Dispose ( bool disposing )if ( disposing )if ( ponents != null )ponents Dispose ( ) ;base Dispose ( disposing ) ;private void InitializeComponent ( )label = new Label ( ) ;button = new Button ( ) ;button = new Button ( ) ;ListBox = new ListBox ( ) ;textBox = new TextBox ( ) ;SuspendLayout ( ) ;label Location = new Point ( ) ;label Name = label ;label Size = new Size ( ) ;label TabIndex = ;label Text = 往客户端反馈信息 ;//同样的方式设置其他控件 这里略去

this Controls Add ( button ) ;this Controls Add ( textBox ) ;this Controls Add ( label ) ;this Controls Add ( button ) ;this Controls Add ( ListBox ) ;this MaximizeBox = false ;this MinimizeBox = false ;this Name = Form ;this Text = C#的网络编程服务器端! ;this Closed += new System EventHandler ( this Form _Closed ) ;this ResumeLayout ( false ) ;

private void Listen ( )//创建一个tcpListener对象 此对象主要是对给定端口进行侦听tcpListener = new TcpListener ( ) ;//开始侦听tcpListener Start ( ) ;//返回可以用以处理连接的Socket实例socketForClient = tcpListener AcceptSocket ( ) ;try//如果返回值是 true 则产生的套节字已经接受来自远方的连接请求if ( socketForClient Connected )ListBox Items Add ( 已经和客户端成功连接! ) ;while ( true )//创建neorkStream对象通过网络套节字来接受和发送数据neorkStream = new NeorkStream ( socketForClient ) ;//从当前数据流中读取一行字符 返回值是字符串streamReader = new StreamReader ( neorkStream ) ;string msg = streamReader ReadLine ( ) ;ListBox Items Add ( 收到客户端信息 + msg ) ;streamWriter = new StreamWriter ( neorkStream ) ;if ( textBox Text != )ListBox Items Add ( 往客户端反馈信息 + textBox Text ) ;//往当前的数据流中写入一行字符串streamWriter WriteLine ( textBox Text ) ;//刷新当前数据流中的数据streamWriter Flush ( ) ;catch ( Exception ey )MessageBox Show ( ey ToString ( ) ) ;static void Main ( )Application Run ( new Form ( ) ) ;

private void button _Click ( object sender System EventArgs e )ListBox Items Add ( 服务已经启动! ) ;_thread = new Thread ( new ThreadStart ( Listen ) ) ;_thread Start ( ) ;

private void button _Click ( object sender System EventArgs e )//关闭线程和流neorkStream Close ( ) ;streamReader Close ( ) ;streamWriter Close ( ) ;_thread Abort ( ) ;tcpListener Stop ( ) ;socketForClient Shutdown ( SocketShutdown Both ) ;socketForClient Close ( ) ;private void Form _Closed ( object sender System EventArgs e )//关闭线程和流neorkStream Close ( ) ;streamReader Close ( ) ;streamWriter Close ( ) ;_thread Abort ( ) ;tcpListener Stop ( ) ;socketForClient Shutdown ( SocketShutdown Both ) ;socketForClient Close ( ) ;

  四.客户端程序设计的关键步骤以及解决办法  

  ( ) 连接到服务器端的指定端口

  我们采用的本地机既做服务器也做客户机 你可以通过修改IP地址来确定自己想要连接的服务器 我们在连接的时候采用了 TcpClient 类 此类是在较高的抽象级别(高于Socket类)上面提供TCP服务 下面代码就是连接到本地机(端口为 ) 并获取响应流

//连接到服务器端口 在这里是选用本地机器作为服务器 你可以通过修改IP地址来改变服务器trymyclient = new TcpClient ( localhost ) ;catchMessageBox Show ( 没有连接到服务器! ) ;return ;//创建neorkStream对象通过网络套节字来接受和发送数据neorkStream = myclient GetStream ( ) ;streamReader = new StreamReader ( neorkStream ) ;streamWriter = new StreamWriter ( neorkStream ) ;

  ( ) 实现接受和发送数据

  在接受和发送数据上面 我们依然采用了 NeorkStream 类 因为对他进行操作比较简单 具体实现发送和接受还是通过命名空间 System IO 中 StreamReader 类ReadLine ( )方法和 StreamWriter 类的WriteLine ( )方法 具体的实现方法如下

if ( textBox Text == )MessageBox Show ( 请确定文本框为非空! ) ;textBox Focus ( ) ;return ;trystring s ;//往当前的数据流中写入一行字符串streamWriter WriteLine ( textBox Text ) ;//刷新当前数据流中的数据streamWriter Flush ( ) ;//从当前数据流中读取一行字符 返回值是字符串s = streamReader ReadLine ( ) ;ListBox Items Add ( 读取服务器端发送内容 + s ) ;catch ( Exception ee )MessageBox Show ( 从服务器端读取数据出现错误 类型为 + ee ToString ( ) ) ;

  ( ) 最后一步和服务器端是一样的 就是要关闭程序中创建的流 具体如下

streamReader Close ( ) ;streamWriter Close ( ) ;neorkStream Close ( ) ;   五.客户端的部分代码

  由于在客户端不需要侦听网络 所以在调用上面没有程序阻塞情况 所以在下面的代码中 我们没有使用到线程 这是和服务器端程序的一个区别的地方 总结上面的这些关键步骤 可以得到一个用C#网络编程 完整的客户端程序(client cs) 具体如下

using System ;using System Drawing ;using System Collections ;using System ComponentModel ;using System Windows Forms ;using System Data ;using System Net Sockets ;using System IO ;using System Threading ;//导入程序中使用到的名字空间public class Form : Formprivate ListBox ListBox ;private Label label ;private TextBox textBox ;private Button button ;private NeorkStream neorkStream ;private StreamReader streamReader ;private StreamWriter streamWriter ;TcpClient myclient ;private Label label ;

private System ComponentModel Container ponents = null ;

public Form ( )InitializeComponent ( ) ;//清除程序中使用的各种资源protected override void Dispose ( bool disposing )if ( disposing )if ( ponents != null )ponents Dispose ( ) ;base Dispose ( disposing ) ;private void InitializeComponent ( )label = new Label ( ) ;button = new Button ( ) ;ListBox = new ListBox ( ) ;textBox = new TextBox ( ) ;label = new Label ( ) ;SuspendLayout ( ) ;label Location = new Point ( ) ;label Name = label ;label Size = new Size ( ) ;label TabIndex = ;label Text = 信息 ;//同样方法设置其他控件AutoScaleBaseSize = new Size ( ) ;ClientSize = new Size ( ) ;this Controls Add ( button ) ;this Controls Add ( textBox ) ;this Controls Add ( label ) ;this Controls Add ( label ) ;this Controls Add ( ListBox ) ;this MaximizeBox = false ;this MinimizeBox = false ;this Name = Form ;this Text = C#的网络编程客户器端! ;this Closed += new System EventHandler ( this Form _Closed ) ;this ResumeLayout ( false ) ;//连接到服务器端口 在这里是选用本地机器作为服务器 你可以通过修改IP地址来改变服务器trymyclient = new TcpClient ( localhost ) ;catchMessageBox Show ( 没有连接到服务器! ) ;return ;//创建neorkStream对象通过网络套节字来接受和发送数据neorkStream = myclient GetStream ( ) ;streamReader = new StreamReader ( neorkStream ) ;streamWriter = new StreamWriter ( neorkStream ) ;static void Main ( )Application Run ( new Form ( ) ) ;

private void button _Click ( object sender System EventArgs e )

if ( textBox Text == )MessageBox Show ( 请确定文本框为非空! ) ;textBox Focus ( ) ;return ;trystring s ;//往当前的数据流中写入一行字符串streamWriter WriteLine ( textBox Text ) ;//刷新当前数据流中的数据streamWriter Flush ( ) ;//从当前数据流中读取一行字符 返回值是字符串s = streamReader ReadLine ( ) ;ListBox Items Add ( 读取服务器端发送内容 + s ) ;catch ( Exception ee )MessageBox Show ( 从服务器端读取数据出现错误 类型为 + ee ToString ( ) ) ;

private void Form _Closed ( object sender System EventArgs e )streamReader Close ( ) ;streamWriter Close ( ) ;neorkStream Close ( ) ;

  六.总结

cha138/Article/program/net/201311/14603

相关参考

知识大全 初探DeepEarth控件

初探DeepEarth控件  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  DeepEarth是一

知识大全 初探PHPcms模块开发介绍

初探PHPcms模块开发介绍  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  由于工作关系只能暂时

知识大全 ASP.NET ViewState初探

ASP.NETViewState初探  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  和刚接触页面

知识大全 ASP.NET ViewState 初探

ASP.NETViewState初探  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!请看下面的示例要

知识大全 PHP 5.3闭包语法初探

PHP5.3闭包语法初探  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  PHP将加入闭包语法也就

稻田养鱼技术初探

荣县观山镇耕地面积21400亩,其中稻田面积7100亩,是幸福堰水库自流灌区,适合于稻田养鱼的发展面积有1536亩。形成了一套比较成熟的稻田养鱼综合技术,现将这一技术措施总结以后:一、稻田养鱼的条件:

稻田养鱼技术初探

荣县观山镇耕地面积21400亩,其中稻田面积7100亩,是幸福堰水库自流灌区,适合于稻田养鱼的发展面积有1536亩。形成了一套比较成熟的稻田养鱼综合技术,现将这一技术措施总结以后:一、稻田养鱼的条件:

知识大全 ASP.NET ViewState 初探 (1)

ASP.NETViewState初探(1)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 

知识大全 初探Java 7异常处理功能增强

初探Java7异常处理功能增强  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  今天我们来看看Ja

初探化学法处理电镀废水的理论基础

初探化学法处理电镀废水的理论基础王克和1,魏雪青2,王海燕3(1.大连市表面工程协会,辽宁大连116013;2.梅河口市产品质量检验所,吉林梅河口135000;3.中国环境科学研究院,北京100012