基于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"); //服务器IP
try
{
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)。

C#基于Socket的CS模式的完整例子的更多相关文章

  1. 基于spring mvc的注解DEMO完整例子

    弃用了struts,用spring mvc框架做了几个项目,感觉都不错,而且使用了注解方式,可以省掉一大堆配置文件.本文主要介绍使用注解方式配置的spring mvc,之前写的spring3.0 mv ...

  2. nodejs的cs模式聊天客户端和服务器实现

    学习完nodejs的基础后,自然要写点东西练练手,以下是一个基于nodejs的cs模式的聊天软件代码: net模块是nodejs的网络编程必定用到的一个模块,对socket通信进行了封装 实现的功能: ...

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

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

  4. 与众不同 windows phone (30) - Communication(通信)之基于 Socket TCP 开发一个多人聊天室

    原文:与众不同 windows phone (30) - Communication(通信)之基于 Socket TCP 开发一个多人聊天室 [索引页][源码下载] 与众不同 windows phon ...

  5. Java基于Socket文件传输示例

    http://www.blogjava.net/sterning/archive/2007/10/13/152508.html 最近需要进行网络传输大文件,于是对基于socket的文件传输作了一个初步 ...

  6. 基于Socket网络编程

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/a2011480169/article/details/73602708 博客核心内容: 1.Sock ...

  7. c++之socket,阻塞模式

    这里描述下socket的阻塞模式: 首先,socket有几个函数 socket() 创建socket bind() 绑定socket到一个地址 listen() 开启soket监听 accept()  ...

  8. Android 基于Socket的聊天应用(二)

    很久没写BLOG了,之前在写Android聊天室的时候答应过要写一个客户(好友)之间的聊天demo,Android 基于Socket的聊天室已经实现了通过Socket广播形式的通信功能. 以下是我写的 ...

  9. 基于事件的异步模式——BackgroundWorker

    实现异步处理的方法很多,经常用的有基于委托的方式,今天记录的是基于事件的异步模式.利用BackgroundWorker组件可以很轻松的实现异步处理,并且该组件还支持事件的取消.进度报告等功能.本文以计 ...

随机推荐

  1. mysql慢查询工具

    GeorgeHao 安装过程: [root@localhost-centos6 ~]# wget percona.com/get/pt-query-digest [root@localhost-cen ...

  2. Access-Control-Allow-Origin设置多个域名

    Access-Control-Allow-Origin只能返回一个. 所以用以下方法实现多个白名单域名:创建一个数据,获取请求中origin,如果在数组里,就返回该origin,如果不在,就返回一个默 ...

  3. How to install VIB on VMware ESXi

    What is VIB? A vib is  vSphere Installation Bundle. To make it more detailed, one can look at the vS ...

  4. Linux忘记Mysql原来root的密码

    Linux忘记Mysql原来root的密码 1.首先需要有linux操作系统root的权限 2.ps aux | grep mysql (或者 systemctl status mysql) 发现my ...

  5. Scaffold your ASP.NET MVC 3 project with the MvcScaffolding package

    原文发布时间为:2011-05-21 -- 来源于本人的百度文章 [由搬家工具导入] http://blog.stevensanderson.com/2011/01/13/scaffold-your- ...

  6. ssh xshell 连接在vim中无法用 ctrl+insert 复制黏贴

    在用户目录编辑.vimrc文件不存在则创建,vi的三种模式:命令模式,插入模式,可视模式,鼠标可以启动于各种模式中,所以配置文件中的set mouse=a启动了所有模式,这样就屏蔽了鼠标右健功能,se ...

  7. 如何通过友盟分析发布后App崩溃日志

    http://blog.csdn.net/totogo2010/article/details/39892467 要分析崩溃日志,首先需要保留发布时的编译出来的.xcarchive文件.这个文件包含了 ...

  8. 100行代码实现最简单的基于FFMPEG+SDL的视频播放器(SDL1.x)【转】

    转自:http://blog.csdn.net/leixiaohua1020/article/details/8652605 版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[-] ...

  9. UVA 11324 The Largest Clique(缩点+DAG上的dp)

    求最大团.和等价性证明有类似之处,只不过这个不是求互推,而是只要a->b,或b->a即可. 同样的,容易想到先缩点,得到DAG,每个节点上保存SCC的点数,相信任意一条由根节点(入度为零) ...

  10. codeforces-505B

    题目连接:http://codeforces.com/contest/505/problem/B B. Mr. Kitayuta's Colorful Graph time limit per tes ...