转   http://www.cnblogs.com/cailangwei/archive/2011/11/21/2258191.html

基于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 编程的更多相关文章

  1. Linux下的C Socket编程 -- server端的继续研究

    Linux下的C Socket编程(四) 延长server的生命周期 在前面的一个个例子中,server在处理完一个连接后便会立即结束掉自己,然而这种server并不科学啊,server应该是能够一直 ...

  2. java socket编程(li)

    一.网络编程中两个主要的问题 一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输.在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可以 ...

  3. Python Socket 编程——聊天室示例程序

    上一篇 我们学习了简单的 Python TCP Socket 编程,通过分别写服务端和客户端的代码了解基本的 Python Socket 编程模型.本文再通过一个例子来加强一下对 Socket 编程的 ...

  4. Linux下的C Socket编程 -- server端的简单示例

    Linux下的C Socket编程(三) server端的简单示例 经过前面的client端的学习,我们已经知道了如何创建socket,所以接下来就是去绑定他到具体的一个端口上面去. 绑定socket ...

  5. Linux下的C Socket编程 -- 获取对方IP地址

    Linux下的C Socket编程(二) 获取域名对应的IP地址 经过上面的讨论,如果我们想要连接到远程的服务器,我们需要知道对方的IP地址,系统函数gethostbyname便能够实现这个目的.它能 ...

  6. Linux下的C Socket编程 -- 简介与client端的处理

    Linux下的C Socket编程(一) 介绍 Socket是进程间通信的方式之一,是进程间的通信.这里说的进程并不一定是在同一台机器上也有可能是通过网络连接的不同机器上.只要他们之间建立起了sock ...

  7. python网络编程-socket编程

     一.服务端和客户端 BS架构 (腾讯通软件:server+client) CS架构 (web网站) C/S架构与socket的关系: 我们学习socket就是为了完成C/S架构的开发 二.OSI七层 ...

  8. Socket编程实践(2) Socket API 与 简单例程

    在本篇文章中,先介绍一下Socket编程的一些API,然后利用这些API实现一个客户端-服务器模型的一个简单通信例程.该例子中,服务器接收到客户端的信息后,将信息重新发送给客户端. socket()函 ...

  9. Socket编程实践(1) 基本概念

    1. 什么是socket socket可以看成是用户进程与内核网络协议栈的编程接口.TCP/IP协议的底层部分已经被内核实现了,而应用层是用户需要实现的,这部分程序工作在用户空间.用户空间的程序需要通 ...

  10. [转]C语言SOCKET编程指南

    1.介绍 Socket编程让你沮丧吗?从man pages中很难得到有用的信息吗?你想跟上时代去编Internet相关的程序,但是为你在调用 connect() 前的bind() 的结构而不知所措?等 ...

随机推荐

  1. 继承AppCompatActivity的Activity隐藏标题栏

    继承了AppCompatActivity的Activity无法通过调用requestWindowFeature(Window.FEATURE_NO_TITLE)来隐藏标题栏. public class ...

  2. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  3. BZOJ 3944 Sum

    题目链接:Sum 嗯--不要在意--我发这篇博客只是为了保存一下杜教筛的板子的-- 你说你不会杜教筛?有一篇博客写的很好,看完应该就会了-- 这道题就是杜教筛板子题,也没什么好讲的-- 下面贴代码(不 ...

  4. 分分钟搞定IOS远程消息推送

    一.引言 IOS中消息的推送有两种方式,分别是本地推送和远程推送,本地推送在http://my.oschina.net/u/2340880/blog/405491这篇博客中有详细的介绍,这里主要讨论远 ...

  5. Spring在非web应用中关闭IoC容器 (registerShutdownHook)

    在基于web的ApplicationContext实现中,已有相应的实现来处理关闭web应用时恰当地关闭Spring IoC容器.但,如果你正在一个非web应用的环境下使用Spring的IoC容器,如 ...

  6. 用上了ReSharper

    用上了ReSharper,发现很爽1.使用var2.去掉无用的using3.将foreach改为linq let4.字符串为cost5.作用域与变量名适配6.文件夹与namespace不匹配7.去掉为 ...

  7. 精通Web Analytics 2.0 (10) 第八章:竞争情报分析

    精通Web Analytics 2.0 : 用户中心科学与在线统计艺术 第八章:竞争情报分析 在现实世界中,收集竞争情报可能意味着雇人在竞争对手的垃圾桶(实际会发生!)翻找. 在虚拟世界中,堆如山的数 ...

  8. CSS实现文字省略

    1.首先给用于放文本的标签元素设置一个宽度值,并设置溢出属性overflow为溢出隐藏. width: 245px;/*一定要设置固定宽度*/ overflow: hidden;/*不显示超过对象尺寸 ...

  9. LinuxMint配置Git(图文教程)

    1.生成秘钥(直接回车,秘钥存放路径看命令行信息) 2.打开秘钥,需要注意的是.ssh可能是隐藏的,这时需要Ctrl+H显示隐藏文件夹 3.复制秘钥,添加到GitHub(Settings), 4.添加 ...

  10. VPS服务商

    1.vpsee http://www.vpsee.com 2.vps侦探 http://www.vpser.net/