基于C_Socket的网络通信程序设计

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

2009年第4期福建电脑

基于C#-Socket的网络通信程序设计

李巧玲1,2

(1、华东师范大学信息学院上海2000622、台州广播电视大学浙江台州318000)【摘要】:本文介绍Visual C#基于.net framework平台,结合socket的网络编程功能来实现C/S模式下的程序开发。最

后通过实例网络五子棋讲述了C#中如何使用Socket实现数据传送和接收,同时结合多线程开发模式实现了多客户端与服务器的通信。

【关键字】:VisualC#、Socket、多线程

0、引言

Socket就是套接字的英文名称,主要是用于网络通信编程,套接字是通信的基石,是支待TCP/IP协议的网络通信的本操作单元。可以将套接字看作不同主机间的进程进行双向通信的端点,在TCP/IP网络中,传送和接收数据就会经常使用到Socket,由于使用Socket能够在网络上处理复杂数据,所以在各种网络应用程序中,涉及到数据传送和接收,一般都会使用Socket。

Visual C#是一种简洁、类型安全的面向对象的语言,开发人员可以使用它来构建在.NET Framework上运行的各种安全、可靠的应用程序。C#语法简化了C++的诸多复杂性,提供很强的网络编程功能。Visual C#通过Socket的托管来实现网络通信。

1、socket通信机制

1.1Socket套接字工作原理

根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认。

所谓服务器监听,是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。

所谓客户端请求,是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。

所谓连接确认,是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。

2、C#中socket编程实现

Visual C#主要网络功能主要使用.Net FrameWork SDK中的提供的二个命名空间".Sockets"和""。而实现Socket使用的是命名空间".Sockets"中的Socket 类。在.Net中,.Sockets命名空间为需要严密控制网络访问的开发人员提供了Windows Sockets(Winsock)接口的托管实现。.Net类可以视为包含3个层次:请求/响应层、应用协议层、传输层。Socket类处于传输层。命名空间中的所有其他网络访问类都建立在该套接字Socket实现之上。Visual C#通过创建Socket类的实例来实现Socket的托管。

在Visual C#中首先创建Socket对象的实例,创建完Socket 实例后,可以通过此Socket实例的Bind方法绑定到网络中指定的终结点,也可以通过其Connect方法向指定的终结点建立的连接。连接创建完毕,就可以使用其Send或SendTo方法将数据发送到Socket;同样使用其的Receive或ReceiveFrom方法从Socket中读取数据。在Socket使用完毕后,请使用其的Shutdown 方法禁用Socket,并使用Close方法关闭Socket。

3、多线程技术

多线程是和进程联系在一起的,进程是应用程序执行实例,线程是Win32的最小执行单元,一个进程可以有多个线程,其中一个为主线程。进程是系统资源分配的基本单位,而线程是系统处理器分配的基本单元,一个进程中的多个线程可以同时执行代码。当然实际上只是处理器在各个线程间频繁地切换,给人的感觉是好象同时执行的。在利用多线程进行程序设计时,要充分考虑到并发性、安全性等问题,才能提高程序及系统的效率,发挥出多任务并行的高效性。

4、基于C/S的网络五子棋程序开发设计

4.1系统分析

程序采用了面向对象技术开发,分为服务端和客户端,服务端作为一个平台采用多线程技术为多个客户端服务,实现:消息传送、胜负判定、管理客户端连接。客户端在连接服务端后为用户提供落子、聊天、实现悔棋等功能提供界面和交互功能。能从服务端接收各类信息进行处理反馈给用户。如图1所示。

图1系统功能图

4.2系统设计

4.2.1服务端功能模块

服务端程序主类服务响应类。主要负责游戏的具体功能实现,并通过消息功能对象控制所有客户端的同步。主要功能如下:

(1)连接管理功能

当服务端开始运行时,首先实例化一个有服务响应对象,并启动一个新线程来调用监听方法,负责监听客户端连接、并另起一个线程检测到键盘输入exit时结束程序。

(2)游戏功能

本功能又分为以下几个部分:

135

2009年第4期

福建电脑

(上接第158页)

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

输入签到包文:1位开始位+2位包长度+2位交易类型+2位银行类别+2位卡种类+8位结算日期+1位结束位+1位校验位;签到返回包文:1位开始位+2位包长度+2位交易类型+2位银行类别+2位卡种类+2位签到响应码+1位结束位+1位校验位。

打包向POS发送签到包文,等待POS返回包文,收到包文后解包显示签到结果。

4.2消费交易接口模块

向POS机发送消费包文,显示消费结果,并向交易表写入成功的交易记录。输入交易包文:1位开始位+2位包长度+2位交易类型+2位银行类别+2位卡种类+8位结算日期+1位结束位+1位校验码;交易返回包文:1位开始位+2位包长度+2位交易类型+2位银行类别+2位卡种类+2位交易响应码+1位结束位+1位校验码。

打包向POS发送消费交易包文,等待POS返回包文,收到包文后解包显示消费结果。

4.3扎帐交易接口模块

向POS机发送扎帐指令,显示扎帐结果。输入扎帐包文:1位开始位+2位包长度+2位交易类型+2位银行类别+2位卡种类+8位结算日期+1位结束位+1位校验码;扎帐返回包文:1位开始位+2位包长度+2位交易类型+2位银行类别+2位卡种类+2位交易响应码+2位消费总笔数+12位消费总金额+1位结束位+1位校验码。

打包向POS发送扎帐交易包文,等待POS返回包文,收到包文后解包显示扎帐结果。

4.4查询交易接口模块

向POS机发送查询包文,得到查询结果。输入查询包文:1位开始位+2位包长度+2位交易类型+2位银行类别+2位卡种类+8位结算日期+1位结束位+1位校验码;扎帐返回包文:1位开始位+2位包长度+2位交易类型+19位卡号+10姓名+12位医保存折余额+12位电子存折余额+12位电子钱包余额+2位交易响应码+1位结束位+1位校验码。

打包向POS发送查询交易包文,等待POS返回包文,收到包文后解包显示查询结果。

5、结束语

随着银行卡业务的不断发展,持卡人数量的日益增多,商业持卡消费的比例越来越大,银行卡在超市管理系统中的应用,在创造良好的用卡环境,使持卡人消费更方便、快捷方面的将起到比较重要的作用。

参考文献:

1.Simo Robinson著,杨浩等译,C#高级编程,Professional C#2nd Edi-tion,清华大学出版社,2002

2.Sami Zahran著,软件过程改进(英文版),Software Process Improvement 机械工业出版社,2003

3.李德奇、梁洁婷著,程序设计,人民邮电出版社,2007

开局:识别并设置黑白双方玩家及旁观者身份,如是旁观者,则将信息栈里的棋局信息发送给旁观者。

当客户端连接,并请求开局时,判断是否还未确定黑白方。如还未确定,则随机指定黑或者白方为当前请求客户端。然后等待下一个开局请求,作为另一方。当双方都就绪时,游戏开始。

认输:如当前是游戏进行状态,则广播认输信息给所有客户端,并结束游戏。

求和/悔棋:如当前是游戏进行状态,则向游戏另一方玩家发送求和/悔棋询问。当返回允许操作时,则做相应处理。反之,不处理。

玩家逃跑:如当前是游戏进行状态,有客户端连接断开,则判断该客户端是否是游戏中的双方。如是,则广播玩家逃跑,游戏结束。反之,不处理。

聊天:只要是连接到服务端的客户端均可聊天,因为本程序未做用户模块,故所有聊天信息会冠以IP+端口号的形式,如:[127.0.0.1:6421]。

胜负判定:棋盘上有当前行棋方的任意五颗棋子连成一线时,即为判胜

4.2.2消息处理类

本类是服务端和客户端的沟通管道。主要处理接收客户端发送的各类请求,如:连接请求、开局请求、落子请求、认输请求、求和请求、悔棋请求等,在收到这些请求时可以调用服务响应对象提供服务。主要功能是消息处理:当收到客户端消息时,将数据包得到之后,通过委托方法转换成可以识别的信息。再调用相应的服务。

4.2.3客户端功能模块

主界面类,本类是游戏和用户唯一直接交互的类,用于接受用户鼠标键盘等的输入,并将落子信息、聊天消息通过Socket接口用数据包发送给服务端进行处理,并接受服务端处理结果的反馈显示给用户。

对于旁观者客户端,会接收从服务端返回是否已开局的信息,如未开局,可以选择开局。反之,则接收当前棋局的状态。4.2.4系统实施中的委托

protected delegate void StartDelegate(int ChessColor);//开局委托

protected delegate void DownDelegate(string DownInfo);//落子委托

protected delegate void StopDelegate(string Content);//游戏结束委托

protected delegate void RetryDelegate(string Content);//重新落子委托

protected delegate void OldHistoryDelegate(string Content);//获取棋局历史委托

protected delegate void StandoffDelegate(string Content);//和局委托

protected delegate void PleaMessageDelegate(string Content);//求和委托

protected delegate void SystemMessageDelegate(string Content);//系统消息委托

protected delegate void BackDelegate(string Content);//请求悔棋消息委托

protected delegate void FeeBDelegate(string Content);//同意悔棋消息委托

protected delegate void SDwnDelegate(string Content);//特许落子消息委托

protected delegate void FobnDelegate(string Content);//获取服务参数消息委托

5、小结

本文介绍了套接字的基本概念和实现套接字编程的基本原理,以及在C#下进行套接字编程的实现方法。并应用C#托管socket技术开发网络五子棋,使用Socket与多线程机制相结合的机制,编写多客户端与服务器的并发通信程序。编写基于C/S 的网络程序方法很多,但使用C#-Socket套接字多线程开发模式,简化了代码,开发更加方便快捷。

参考文献:

1.李兰友,杨晓光.Visual C#.Net程序设计.清华大学出版社[M].2004-4

2.刘光蓉.运用Visual C++构建基于Socket的C/S模式通信[J].武汉工业学院学报,2004,23(3):29-31.

3.何进,谢松巍.基于Socket的TCP/IP网络通讯模式研究[C].计算机应用研究,2001,8:134-135.

4.张莹,于重重,刘杰.基于.Net Socket局域网多机校时的设计与实现[J].微计算机信息,2007,2-3:145-146

5.朱蓉.利用中间件Socket实现多客户机端底层网络通信.计算机系统应用,2005

136

相关文档
最新文档