基于Socket服务器端实现本例主要是建立多客户端与服务器之间的数据传输,首先设计服务器。打开VS2008,在D:\C#\ch17目录下建立名为SocketServer的Windows应用程序。打开工程,往当前窗体中添加控件,如表17-6所示。
表17-6  添加控件列表

控    件

Name

Text

ListBox

lbInfo

Label

label

Button

button1

启动服务器

设计好的界面如图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("222.18.142.171"); 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  添加控件列表

控 件 名

Name

Text

GroupBox

groupBox1

向服务器发送消息

Label

label1

发送消息:

TextBox

textBox1

Button

button2

发送

ListBox

lbInfo

GroupBox

groupBox1

服务器回馈信息

客户端的设计主要分为以下步骤。
(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("222.18.142.171");   //服务器IPtry{          s.Connect(serverIP, 13);                        //连接服务器,端口号用13}catch (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());              //将从流中读取的数据写入lbInfo28  }catch (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中显示客户端也收到了来自服务器的回馈消息。此外,本例还能实现多个客户端向一个服务器同时收发数据,并已经在三台计算机(一个服务器和两个客户端)上测试通过。本例只是实现了服务器与客户端最简单的数据传输,读者如果有兴趣可以在此基础上再添加其他功能,比如可以利用前面讲的数据库知识,在服务器端写个用户登录验证,让客户端通过验证后才能收发数据等。
在网络中,收发数据会经常使用Socket。本节中主要运用了几节中介绍的Socket基础知识完成了一个简单的基于流的C/S模式例子。在下一节中,将介绍另一种传输方式——基于数据报(UDP)。

转载于:https://www.cnblogs.com/wujy/archive/2011/11/22/2259488.html

C#基于Socket的CS模式的完整例子相关推荐

  1. 多线程+Socket+MFC界面库实现CS模式的云盘系统

    功能:CS 模式文件上传.下载服务器 + 客户端(轻量级的个人云盘系统) 使用方法: 保证文件夹路径E:\myLibForYunPan\data和E:\myLibForYunPan\download存 ...

  2. socket java 客户端_Java基于socket实现的客户端和服务端通信功能完整实例

    本文实例讲述了Java基于socket实现的客户端和服务端通信功能.分享给大家供大家参考,具体如下: 以下代码参考马士兵的聊天项目,先运行ChatServer.java实现端口监听,然后再运行Chat ...

  3. 什么是cs模式_CS的完整形式是什么?

    什么是cs模式 1)CS:公司秘书/计算机科学 (1) CS: Company Secretary / Computer Science) CS is an abbreviation of the C ...

  4. Java基于Socket文件传输示例(转)

    最近需要进行网络传输大文件,于是对基于socket的文件传输作了一个初步的了解.在一位网友提供的程序基础上,俺进行了一些加工,采用了缓冲输入/输出流来包装输出流,再采用数据输入/输出输出流进行包装,加 ...

  5. python网络通信中cs架构_python3基于TCP实现CS架构文件传输

    本文实例为大家分享了python3实现CS架构文件传输的具体代码,供大家参考,具体内容如下 1.目标: 基于tcp实现CS架构的文件传输 指令列表:(1)get:从服务器端下载文件 (2)put:向服 ...

  6. c++使用OpenSSL基于socket实现tcp双向认证ssl(使用TSL协议)代码实现

    相信各位对OpenSSL库已经不陌生了,目前笔者使用这个库实现了RSA.AES加解密和tcp的双向认证功能,下面来看tcp的双向认证. 1.什么是双向认证 简单说双向认证就是:客户端认证服务端是否合法 ...

  7. 【Docker学习总结】11.Docker的CS模式

    前几篇总结了Docker有关容器以及镜像方面的相关知识,从本篇开始我们就升华到了宏观方向的学习,这次我们来了解一下Docker的CS模式. 在前面的学习中我们了解到,Docker是以客户端和守护进程的 ...

  8. MFC 基于SOCKET 实现服务端客户端一对多

    注意:本篇文章源代码贴得很多,所以有点长,如果觉得阅读不方便,可以直接复制源代码到你的程序里去,也可以直接下载源码.后面整合了socket方法写了一个类,源码下载里没有. 源码下载:https://d ...

  9. 【java毕业设计】基于java+swing+CS的图书销售管理系统GUI设计与实现(毕业论文+程序源码)——图书销售管理系统

    基于java+swing+CS的图书销售管理系统GUI设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+swing+CS的图书销售管理系统GUI设计与实现,文章末尾附有本毕业设计的 ...

最新文章

  1. 用友Cell组件使用总结
  2. 最短路径问题 java实现 源代码
  3. 信息抽取--新词提取
  4. centos 安装idea 非可视化_太厉害了!目前 Redis 可视化工具最全的横向评测
  5. oracle表和对象基础维护笔记
  6. 为什么越普通的男人越自信?
  7. 在TOMCAT中使用JNDI连接数据源
  8. TLS1.3对CIP的影响(对密码套件的解释)
  9. CentOS基本的命令与快捷建
  10. N个结点不同结构的二叉树个数
  11. 如何实现代码自动生成?
  12. ios android 通用字体,教你如何在iOS项目中设置各种字体
  13. imei模拟修改_自动修改android模拟设备号imei的小程序
  14. MySQL 数据库命名规范.PDF
  15. Problem: [Usaco2018 Open]Team Tic Tac Toe
  16. ecshop其他页面判断是智能手机访问也跳转到ECTouch对应手机版页面[有修正]
  17. guzzle php,windows系统下安装使用guzzle
  18. springcontext.xml 中方言是红色的_12种方言都能听懂!讯飞智能录音笔A1评测:小如钥匙坠+复古磁带造型...
  19. 阿里达摩院数学竞赛新一轮考题曝光,李永乐老师曾给出第一题详细解答
  20. CAD设置图层透明显示

热门文章

  1. 图论-欧拉图-欧拉回路-Euler-Fluery-Hierholzer-逐步插入回路法-DFS详解-并查集
  2. springboot2.x 与 elasticsearch2.4.x整合出错:None of the configured nodes are available
  3. Mask R-CNN详解
  4. 如何设计一个合适的系统电源
  5. cpu和内存之间——地址映射
  6. C语言运算符优先级 (备忘)
  7. HTML MIME Type
  8. R金融统计:收益、随机行走和模拟
  9. PHP会话管理——Session和Cookie
  10. 出国?上研?工作?回家种田?(三) IT类专业的工作方向与特点(软硬件技术等岗位)