C#基于Socket的CS模式的完整例子.doc_第1页
C#基于Socket的CS模式的完整例子.doc_第2页
C#基于Socket的CS模式的完整例子.doc_第3页
C#基于Socket的CS模式的完整例子.doc_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

所谓C/S模式中的C是Client,表示客户端,S是Server,表示服务器;还有另外一个模式B/S,B是Browser,表示浏览器,S是Server,表示服务器。C/S模式主要是指在Winform中进行开发,而B/S主要是在ASP.NET中进行开发。本节先介绍C/S模式,有关B/S模式将会在后面有关ASP.NET的章节中进行介绍。基于Socket服务器端实现本例主要是建立多客户端与服务器之间的数据传输,首先设计服务器。打开VS2008,在D:C#ch17目录下建立名为SocketServer的Windows应用程序。打开工程,往当前窗体中添加控件,如表17-6所示。表17-6添加控件列表控 件NameTextListBoxlbInfoLabellabelButtonbutton1启动服务器设计好的界面如图17-2所示。接下来开始运用前面的知识设计服务器,主要分为以下步骤。(1)首先是对一些命名空间的包含,包括System.Net、System.Net.Sockets、System.IO和System.Threading。然后定义一系列的全局变量,如下所示。private Socket s; /定义Socket对象private Thread th; /客户端连接服务器的线程public Socket cSocket; /单个客户端连接的Socket对象public NetworkStream ns; /网络流public StreamReader sr; /流读取public StreamWriter sw; /流写入private delegate void SetTextCallback(); /用于操作主线程控件(2)接下来是设计客户端连接的管理,主要包括服务器与客户端之间的连接和收发数据问题,把它们放在一个函数Communication里,如下所示。public void Communication() while (true) try cSocket = s.Accept(); /用cSocket来代表该客户端连接 if (cSocket.Connected) /测试是否连接成功 ns = new NetworkStream(cSocket);/建立网络流,便于数据的读取 sr = new StreamReader(ns); /实例化流读取对象 sw = new StreamWriter(ns); /实例化写入流对象 test(); /从流中读取 sw.WriteLine(收到请求,允许连接); /向流中写入数据 sw.Flush(); /清理缓冲区 else MessageBox.Show(连接失败); catch (SocketException ex) MessageBox.Show(ex.Message); /捕获Socket异常 catch (Exception es) MessageBox.Show(其他异常 + es.Message); /捕获其他异常 /以下代码的用法在第16章有关线程的用法时曾提到过,主要用于从当前线程操作主线程中的控件,这里就不在赘/述public void send() lbInfo.Items.Add(sr.ReadLine()+n);public void test() SetTextCallback stcb = new SetTextCallback(send); Invoke(stcb);(3)定义好与客户端的连接后,接下来需要利用线程来启动,双击“启动服务器”按钮,添加如下代码。button1.Enabled = false;s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);/创建Socket对象IPAddress serverIP = IPAddress.Parse(71);IPEndPoint server = new IPEndPoint(serverIP,13); /实例化服务器的IP和端口s.Bind(server);s.Listen(10);try th = new Thread(new ThreadStart(Communication); /创建线程 th.Start(); /启动线程 label1.Text = 服务器启动成功!;catch(Exception ex) MessageBox.Show(服务器启动失败! + ex.Message);(4)最后在关闭服务器窗口的时候,还应该关闭线程和当前Socket连接,代码如下所示。protected override void Dispose(bool disposing) try if (disposing & (components != null) components.Dispose(); th.Abort();/禁用当前Socket连接中的数据收发 s.Shutdown(System.Net.Sockets.SocketShutdown.Both); s.Close(); base.Dispose(disposing); catch return; 接着为当前窗体的FormClosed事件添加如下代码。this.Close();至此,服务器就设计完了,下面接着看客户端。基于Socket客户端实现打开VS2008,在D:C#ch17目录下建立名为SocketClient的Windows应用程序。打开工程,往当前窗体中添加控件,如表17-7所示。表17-7添加控件列表控 件 名NameTextGroupBoxgroupBox1向服务器发送消息Labellabel1发送消息:TextBoxtextBox1Buttonbutton2发送ListBoxlbInfoGroupBoxgroupBox1服务器回馈信息客户端的设计主要分为以下步骤。(1)首先要做的工作还是要引用一些命名空间,如下所示。using System.IO;using System.Net.Sockets;using System.Net;然后定义一系列的全局变量,如下所示。private Socket s; /定义Socket对象 public NetworkStream ns; /网络流public StreamReader sr; /流读取public StreamWriter sw; /流写入(2)双击“发送”按钮,添加如下代码。s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);serverIP = IPAddress.Parse(71); /服务器IPtry s.Connect(serverIP, 13); /连接服务器,端口号用13catch (Exception ex) MessageBox.Show(ex.Message);try ns = new NetworkStream(s); /实例化网络流 sr = new StreamReader(ns); /实例化流读取对象 sw = new StreamWriter(ns); /实例化写入流对象 sw.WriteLine(textBox1.Text); /将textBox1.Text的数据写入流 sw.Flush(); /清理缓冲区 lbInfo.Items.Add(sr.ReadLine(); /将从流中读取的数据写入lbInfocatch (Exception ex) MessageBox.Show(ex.Message); /捕获异常(3)最后,关闭Socket连接,释放资源,可以直接在窗体的FormClosed事件中进行,如下所示。s.Shutdown(SocketShutdown.Both);s.Close();至此,服务器和客户端已经全部设计完毕,下面看运行效果。基于Socket的C/S实例的运行首先,启动服务器程序,单击“启动服务器”按钮,如图17-4所示。接着再启动客户端,并在textBox1输入数据(中英文皆可),多次单击“发送”按钮,如图17-5所示。此时,服务器的状态如图17-6所示。收到客户端发送的数据从图17-6中可以看出,此时服务器已经收到来自客户端的数据,而图17-5中显示客户端也收到了来自服务器的回馈消息。此外,本例还能实现多个客户端向一个服务器同时收发数据,并已经在三台计算机(一个服务器和两个客户端)上

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论