C中Socket多线程编程实例_第1页
C中Socket多线程编程实例_第2页
C中Socket多线程编程实例_第3页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、C 中 Socket 多线程编程实例C#中Socket多线程编程实例2021年07月18日星期日10 : 58是微软 随 着新推出的一门语言。它作为一门新兴的语言,有着 C+ 的强健,又有 着VB等的RAD特性。而且,微软推出 C#主要的目的是为了对抗 Sun公 司的 Java。 大家都知道 Java 语言的强大功能,尤其在网络编程方面。于 是,C#在网络编程方面也自然不甘落后于人。本文就向大家介绍一下C#下实现套接字 (Sockets) 编程的一些根本知识,以期能使大家对此有个大致 了解。首先,我 向大家介绍一下套接字的概念。套接字根本概念:套接字是通信的基石, 是支持 TCP/IP 协议的

2、网络通信的根本操作单元。 可以将套接字看作不同主机间的进程进行双向通信的端点, 它构成了单个主 机 内及整个网络间的编程界面。套接字存在于通信域中,通信域是为了处 理一般 的线程通过套接字通信而引进的一种抽象概念。套接字通常和同一 个域中的套 接字交换数据 ( 数据交换也可能穿越域的界限,但这时一定要 执行某种解释程 序) 。各种进程使用这个相同的域互相之间用 Internet 协议 簇来进行通信。套接字可以根据通信性质分类, 这种性质对于用户是可见的。 应用程序 一 般仅在同一类的套接字间进行通信。不过只要底层的通信协议允许,不 同类型 的套接字间也照样可以通信。套接字有两种不同的类型:流套

3、接字 和数据报套 接字。套接字工作原理:要通过互联网进行通信, 你至少需要一对套接字, 其中一个运行于客户机端,我们称之为 ClientSocket ,另一个运行于效劳器端,我们称之为 ServerSocket 。根据连接启动的方式以及本地套接字要连接的目标, 套接字之间的连接 过 程可以分为三个步骤:效劳器监听,客户端请求,连接确认。所谓效劳器监听, 是效劳器端套接字并不定位具体的客户端套接字, 而 是 处于等待连接的状态,实时监控网络状态。所谓客户端请求, 是指由客户端的套接字提出连接请求, 要连接的目标 是 效劳器端的套接字。为此,客户端的套接字必须首先描述它要连接的服 务器的 套接字,

4、指出效劳器端套接字的地址和端口号,然后就向效劳器端 套接字提出 连接请求。所谓连接确认,是指当效劳器端套接字监听到或者说接收到客户端套接 字 的连接请求,它就响应客户端套接字的请求,建立一个新的线程,把服 务器端 套接字的描述发给客户端,一旦客户端确认了此描述,连接就建立 好了。而服 务器端套接字继续处于监听状态,继续接收其他客户端套接字 的连接请求。C#中的套接字编程实例:通过向大家简单的介绍套接字的根本概念和实现套接字编程的根本原理, 我想大家对套接字编程已有了初步的了解。不过,上面介绍的仅仅是 根本概念 和原理,要真正运用还是需要一定的工作的。对根本概念和原理 的真正理解的 最好方法莫过

5、于自己动手做一个实例,下面我就向大家介绍 一个很好的用 C# 实现套接字编程的实例聊天室程序。本程序是基于C/S 效劳器/客户端构架的,程序包含一个效劳器端 的应用程序和一个客户端的应用程序。首先,在效劳器上运行效劳器端的 应用程序,该程序一运行就开始效劳器监听。然后,在客户机上就可以打 开客户端的应用程序。程序翻开后可以与效劳器端应用程序进行连接,即进行客户端 请 求。在连接确认后,客户端用户可以和其他的客户端用户进行聊天。客 户端人 数没有限制,同时还支持 " 悄悄话 " 聊天模式,支持聊天记录。所 以这是一个学 习套接字编程的相当不错的例子。而且,程序中为了处理每 个

6、客户端的信息还 用到了多线程机制。在每个客户端与效劳器端连接成功 后,它们之间就建立一 个线程。这样运用了多线程之后,客户端之间就不 会相互影响,即使其中一个 出了错误也不会影响到另一个。下面,我就向大家具体介绍该实例:效劳器端程序:1. 翻开,新建一个C#的模板为"Windows应用程序啲工程,不妨命 名为 "ChatServer" 。2. 布置界面。只需在界面上添加一个 ListBox 控件即可,该控件主要用 于 显示客户端的用户的一些信息的。图象如下:3. 效劳器端程序的代码编写。对于效劳器端,主要的作用是监听客户端的连接请求并确认其请求。 程序 一开始便翻

7、开一个 StartListening() 线程。private void StartListening()listener=new TcpListener(listenport) ;() ;while(true)Socket s=() ;clientsocket=s ;clientservice=new Thread(new ThreadStart(ServiceClient);() ;catch(Exception e)() ; 该线程是一直处于运行状态的。当效劳器端接收到一个来自客户端的连接 请求后,它就翻开一个 ServiceClient() 线程来效劳客户端。当一个连接被 建 立后,每

8、个客户端就被赋予一个属于它自己的套接字。同时,一个 Client 类 的对象被建立。该对象包含了客户端的一些相关信息,该信息被保存在一 个数 组列表中。 Client 类如下:using System ;using ;namespace ChatServer using ;开,新建一个C#的模板为"Windows应用程序"的工程,不妨命名为 "ChatClient" 。2. 布置界面。往界面上添加一个 ListBox 控件 用于显示用户列表 ,一个 RichTextBox 控件用于显示聊天消息以及系统消息,一个 TextBox 控件 用 于发送消息 ,一

9、个 CheckBox 控件 确定是否为悄悄话 ,一 个 StatusBar 控件 以及四个 Button 控件分别为"连接" 、 "断开连接 "、" 开始记录 "、"发送"。 各个控件的属性设置可以参见源代码中的具体设置, 这里从略。界面设计好后 的图象如下:3. 客户端程序的代码编写。 当客户端试图和效劳器端进行连接时,一个连接必须建立而且得向效劳器 端进行注册。 EstablishConnection 函数运用一个 TcpClient 来和效劳 器端 取得连接,同时创立一个 NetworkStream 来发送消

10、息。还有,端口号和 效劳器 端的是保持一致的,均为 5555。EstablishConnection 函数如下:private void EstablishConnection ="正在连接到效劳器" ;tryclientsocket=new TcpClient serveraddress,serverport ;ns= ;connected=true ;catch(Exception)(" 不能连接到效劳器! "," 错误 ",="已断开连接 " ;在和效劳器端连接成功后,程序就用 RegisterWithSer

11、ver() 函数向效劳 器 端发送一个 CONN 命令。该命令先是发送该用户的名称,然后从效劳器端获 得其他所有用户的列表,所有用户列表是在 ListBox 控件中显示的。该函数 如 下:private void RegisterWithServer()trystring command="CONN|"+ ;Byte outbytes= ;(outbytes,0, ;string tokens=(new Char'|');if(tokens0="LIST")="已连接" ;=true ;for(int n=1 ; n

12、char'"r','"n') ;=clientname+" :已连接到效劳器 " ;catch(Exception)(" 注册时发生错误! "," 错误 ",在此之后,当然就是用户之间的聊天了,由 ReceiveChat() 函数来完成 该函数是一个独立的线程,它处理所有用户获得的消息和用户发送的消息。 它 主要处理了 CHAT 、PRIV 、JOIN 、 GON 、E QU99v 等命令,处理的方法和 效劳器端 的类似。具体函数实现如下:private void ReceiveCh

13、at()while(keepalive)try"CHAT") ; if(logging)Byte buffer=new Byte2048(buffer,0, ;string chatter= ; string tokens=(new Char'|') if(tokens0=(tokens1) ;if(logging)(tokens1) ; if(tokens0="PRIV")("Private from") ; (tokens1.Trim() ; (tokens2+""r"n")

14、("Private from") ;(tokens1.Trim() ;(tokens2+""r"n") ; if(tokens0="JOIN")(tokens1.Trim() ;("has joined the Chat"r"n") ; if(logging)(tokens1+"has joined the Chat") ;string newguy=tokens1.Trim(new char'"r','"n&#

15、39;) if(tokens0="GONE")(tokens1.Trim() ;("has left the Chat"r"n") ;(tokens1+"has left the Chat") char'"r','"n') ;if(tokens0="QU99v")() ;() ;=false ;keepalive=false ; ="效劳器端已停止 " ; connected=false ;=false ;catch(Exc

16、eption)通过以上的一些函数,客户端程序之间就可以进行自由地聊天了,各 个用 户之间还可以互相发送悄悄话。所以程序已经实现了聊天室的根本 功能了,不 过最后各个用户还要正常地退出,那就要用到 QuitChat() 函数 了。该函数的 具体实现如下:private void QuitChat()if(connected)trystring command="GONE|"+clientname ;Byte outbytes= ;(outbytes,0, ;() ;catch(Exception) if(logging)() ;if(receive ! =null&&="客户端" ; 到此为止,客户端程序的主要局部都已经介绍完毕。还有一些按钮 控件的 消息处理函数可以参见源代码。同时,程序中还有一个聊天记录 功能,该功能 和现在流行的聊天软件的记录功能

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论