




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C中Socket 多线程编程实例C#中Socket多线程编程实例 2010年07月18日星期日10:58是微软随着新推出的一门语言。它作为一门新兴的语言,有着 C++的强健,又有着 VB等的RAD特性。而且,微软推出 C#主要的目的是为了对抗 Sun公司的Java。大家都知道Java语言的强大功能,尤其在网络编程方面。于是, C#在网络编程方面也自然不甘落后于人。本文就向大家介绍一下 C#下实现套接字(Sockets)编程的一些基本知识,以期能使大家对此有个大致了解。首先,我向大家介绍一下套接字的概念。套接字基本概念:套接字是通信的基石,是支持 TCP/IP协议的网络通信的基本操作单元。可以将套接字看作不同主机间的进程进行双向通信的端点,它构成了单个主机内及整个网络间的编程界面。套接字存在于通信域中,通信域是为了处理一般的线程通过套接字通信而引进的一种抽象概念。套接字通常和同一个域中的套接字交换数据(数据交换也可能穿越域的界限,但这时一定要执行某种解释程序)。各种进程使用这个相同的域互相之间用 Internet 协议簇来进行通信。套接字可以根据通信性质分类,这种性质对于用户是可见的。应用程序一般仅在同一类的套接字间进行通信。不过只要底层的通信协议允许,不同类型的套接字间也照样可以通信。套接字有两种不同的类型:流套接字和数据报套接字。套接字工作原理:要通过互联网进行通信,你至少需要一对套接字,其中一个运行于客户机端,我们称之为 ClientSocket ,另一个运行于服务器端,我们称之为ServerSocket。根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认。所谓服务器监听,是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。所谓客户端请求,是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。所谓连接确认,是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。C#中的套接字编程实例:通过向大家简单的介绍套接字的基本概念和实现套接字编程的基本原理,我想大家对套接字编程已有了初步的了解。不过,上面介绍的仅仅是基本概念和原理,要真正运用还是需要一定的工作的。对基本概念和原理的真正理解的最好方法莫过于自己动手做一个实例,下面我就向大家介绍一个很好的用 C#实现套接字编程的实例――聊天室程序。本程序是基于C/S(服务器/客户端)构架的,程序包含一个服务器端的应用程序和一个客户端的应用程序。首先,在服务器上运行服务器端的应用程序,该程序一运行就开始服务器监听。然后,在客户机上就可以打开客户端的应用程序。程序打开后可以与服务器端应用程序进行连接,即进行客户端请求。在连接确认后,客户端用户可以和其他的客户端用户进行聊天。客户端人数没有限制,同时还支持 "悄悄话"聊天模式,支持聊天记录。所以这是一个学习套接字编程的相当不错的例子。而且,程序中为了处理每个客户端的信息还用到了多线程机制。在每个客户端与服务器端连接成功后,它们之间就建立一个线程。这样运用了多线程之后,客户端之间就不会相互影响,即使其中一个出了错误也不会影响到另一个。下面,我就向大家具体介绍该实例:服务器端程序:打开,新建一个C#的模板为"Windows应用程序"的项目,不妨命名为"ChatServer"。布置界面。只需在界面上添加一个ListBox控件即可,该控件主要用于显示客户端的用户的一些信息的。图象如下:服务器端程序的代码编写。对于服务器端,主要的作用是监听客户端的连接请求并确认其请求。程序一开始便打开一个 StartListening() 线程。privatevoidStartListening(){listener=newTcpListener(listenport) ;();while(true){try{Sockets=() ;clientsocket=s ;clientservice=newThread(newThreadStart(ServiceClient)) ;();}catch(Exceptione){;}}}该线程是一直处于运行状态的。当服务器端接收到一个来自客户端的连接请求后,它就打开一个 ServiceClient() 线程来服务客户端。当一个连接被建立后,每个客户端就被赋予一个属于它自己的套接字。同时,一个 Client 类的对象被建立。该对象包含了客户端的一些相关信息,该信息被保存在一个数组列表中。Client 类如下:usingSystem;using ;namespaceChatServer{using ;using ;开,新建一个C#的模板为"Windows应用程序"的项目,不妨命名为"ChatClient" 。布置界面。往界面上添加一个ListBox控件(用于显示用户列表),一个RichTextBox控件(用于显示聊天消息以及系统消息),一个TextBox控件(用于发送消息),一个CheckBox控件(确定是否为悄悄话),一个StatusBar控件以及四个Button控件(分别为"连接"、"断开连接"、"开始记录"、"发送")。各个控件的属性设置可以参见源代码中的具体设置,这里从略。界面设计好后的图象如下:客户端程序的代码编写。当客户端试图和服务器端进行连接时,一个连接必须建立而且得向服务器端进行注册。EstablishConnection() 函数运用一个TcpClient 来和服务器端取得连接,同时创建一个 NetworkStream来发送消息。还有,端口号和服务器端的是保持一致的,均为 5555。EstablishConnection() 函数如下:privatevoidEstablishConnection(){="正在连接到服务器";try{clientsocket=newTcpClient(serveraddress,serverport) ;ns=();sr=newStreamReader(ns);connected=true;}catch(Exception){("不能连接到服务器!","错误",;="已断开连接";}}在和服务器端连接成功后,程序就用 RegisterWithServer() 函数向服务器端发送一个 CONN命令。该命令先是发送该用户的名称,然后从服务器端获得其他所有用户的列表,所有用户列表是在 ListBox 控件中显示的。该函数如下:privatevoidRegisterWithServer(){try{stringcommand="CONN|"+;Byteoutbytes= ;(outbytes,0, ;stringserverresponse=() ;();stringtokens=(newChar{'|'}) ;if(tokens[0]=="LIST"){="已连接";=true;}for(intn=1 ;nchar{'"r','"n'})) ;=clientname+":已连接到服务器";}catch(Exception){("注册时发生错误!","错误",,;}}在此之后,当然就是用户之间的聊天了,由 ReceiveChat()函数来完成。该函数是一个独立的线程,它处理所有用户获得的消息和用户发送的消息。它主要处理了CHAT、PRIV、JOIN、GONE、QU99v等命令,处理的方法和服务器端的类似。具体函数实现如下:privatevoidReceiveChat(){boolkeepalive=truewhile(keepalive){try{
;Bytebuffer=newByte[2048]
;(buffer,0,
;stringchatter=
;stringtokens=(newChar{'|'})if(tokens[0]=="CHAT"){
;(tokens[1])if(logging)
;(tokens[1])
;}if(tokens[0]=="PRIV"){("Privatefrom") ;(tokens[1].Trim()) ;(tokens[2]+""r"n") ;if(logging){("Privatefrom") ;(tokens[1].Trim()) ;(tokens[2]+""r"n") ;}}if(tokens[0]=="JOIN"){(tokens[1].Trim()) ;("hasjoinedtheChat"r"n") ;if(logging){(tokens[1]+"hasjoinedtheChat") ;}stringnewguy=tokens[1].Trim(newchar{'"r','"n'}) ;;}if(tokens[0]=="GONE"){(tokens[1].Trim()) ;("haslefttheChat"r"n") ;if(logging){(tokens[1]+"haslefttheChat") ;}char{'"r','"n'})) ;}if(tokens[0]=="QU99v"){();();keepalive=false ;="服务器端已停止";connected=false;=false;=false;}}catch(Exception){}}}通过以上的一些函数,客户端程序之间就可以进行自由地聊天了,各个用户之间还可以互相发送悄悄话。所以程序已经实现了聊天室的基本功能了,不过最后各个用户还要正常地退出,那就要用到 QuitChat() /r
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年全长淬火重型钢轨项目发展计划
- 2025-2030全球及中国相位延迟器行业市场现状供需分析及投资评估规划分析研究报告
- 2025-2030全球及中国汽车夹行业市场现状供需分析及投资评估规划分析研究报告
- 2025-2030全球及中国激光计算机制版(CTP)行业市场现状供需分析及市场深度研究发展前景及规划可行性分析研究报告
- 2025-2030全球及中国浮选油行业市场现状供需分析及投资评估规划分析研究报告
- 2025-2030全球及中国汽车控制装置行业市场现状供需分析及投资评估规划分析研究报告
- 2025-2030全球及中国拟除虫菊酯杀虫剂行业市场现状供需分析及投资评估规划分析研究报告
- 2025-2030全球及中国律师责任保险行业市场现状供需分析及投资评估规划分析研究报告
- 2025-2030全球及中国卡车黑匣子行业市场现状供需分析及投资评估规划分析研究报告
- 2025-2030全球及中国内部数据集成软件行业市场现状供需分析及投资评估规划分析研究报告
- 公司安全生产事故隐患内部报告奖励工作制度
- 做枝花儿送妈妈(课件)三年级下册劳动人教版
- 2024年世界职业院校技能大赛中职组“短视频制作组”赛项考试题库(含答案)
- 《心理压力与调适》课件
- 眼科诊所安全消毒规程
- 水利信息化数据中心及软件系统单元工程质量验收评定表、检查记录
- 新员工培训:廉洁从业
- 专题05 特殊的平行四边形中的最值模型之胡不归模型(原卷版)
- 【人教版】《劳动教育》五上 劳动项目三《制作扇子》 课件
- 2024年浙江温州中学保送生自主招生语文卷试题(含答案详解)
- 用友软件销售服务合同书
评论
0/150
提交评论