[摘要] 使用visual c#.net中的socket编程的关键技术,以及多线程的知识实现一个简单的网上交谈工具,它提供的功能有:用户登录、显示所有当前的在线用户、显示进行交谈的用户信息、与选定的用户进行交谈,并且支持私人交谈。对于开发一般性的通信软件,有一定的参考价值。
[关键词] socket tcp协议 服务器 客户端 线程
一、引言
随着信息技术的高速发展,网上交谈已成为人们学习和工作的重要手段,那么如何设计合理的、人性化的网上交谈工具就成为当务之急。使用visual c#.net中的socket编程技术,以及多线程的知识可快速、方便地设计理想的网上交谈工具。一个socket通信无论功能多么齐全、程序多么复杂,其基本结构均应包括以下步骤:创建socket对象,建立连接;打开连接到socket的输入/输出流;对socket进行读写操作;关闭socket套接字,关闭流。
二、tcp协议通信的流程
tcp协议是面向连接的协议,它的实现需要数据发送方和数据接收方建立数据通信连接,它的具体流程如下:
1.服务器端首先创建服务器套接字
2.服务器套接字监听一个端口,等待客户端的请求
3.客户端创建一个客户端套接字
4.客户端向服务器发送连接请求
5.服务器确认与客户端的连接
6.客户端和服务器利用建立的连接进行通信
7.通信完毕后,客户端和服务器关闭各自的连接
三、socket编程简介
1.利用socket建立服务器程序
要用socket建立一个tcp服务器程序,一般需要以下几个步骤:
(1)创建一个服务器套接字,用ip地址和端口初始化服务器
(2)监听服务器端口
(3)确认与客户端的连接
(4)处理客户端的请求并回应客户端
(5)断开客户端的连接,释放客户端的连接
(6)关闭服务器,释放服务器连接
2.利用socket建立客户端程序
要用socket建立一个tcp客户端程序,一般需要以下几个步骤:
(1)创建客户端套接字
(2)连接服务器
(3)得到与服务器通信的流通道
(4)向服务器发送数据
(5)接收从服务器发回的数据
(6)断开连接
四、设计方案
1.服务器端的设计
服务器端管理着交谈任务,它维持着一张当前在线用户的列表,转发用户发送来的信息,主要功能如下:
监听本机ip地址中的一个指定的端口。
当有客户端向该端口发出请求时,服务器程序立即建立一个与该客户端的连接并启动一个新的线程来处理该客户端的所有请求。
根据客户端发送来的各种不同的请求,执行相应的操作,并将处理结果返回给该客户端。服务器能识别4种请求命令:conn(建立新的连接)、chat(聊天)、priv(私聊)和exit(离开),服务器接收ascii字符信息,用“|”分隔信息的各个部分,一条信息包含一条命令,一个或多个信息参数。
2.客户端的设计
客户端应用程序包含用户登录窗口和用户交谈的主窗口,它允许用户登录到服务器,可以向服务器发送信息,同时可以接收从服务器返回的信息,设计的主要功能如下:
向远程服务器发送连接请求。
得到服务器程序的确认后,建立与服务器的连接,并获得与服务器交互的流通道(networkstream)。
通过网络流通道与服务器端的程序进行数据通信。向服务器发送服务器能够识别的以上4种命令请求,同时也接收服务器发回的命令。客户端能够识别的命令有join(通知当前在线用户有新的用户进入聊天室)、list(更新当前在线用户)和quit(关闭客户端程序)。客户端程序接收ascii字符信息,用“|”分隔信息的各个部分,一条信息包含一条命令,一个或多个信息参数。
五、解决方案
1.服务器端的实现
服务器端是一个windows窗体应用程序,命名为chatserver。当运行服务器程序时,单击服务器窗体上的“启动”按钮后,便启动了服务器进程。为了使用socket对象和thread对象,在代码文件中加入名字空间system.net、system.net..socket、system..threading的引用。
在服务器端使用了多线程,每个用户通过一个单独的线程进行连接,当服务器开始运行时,它就启动一个线程等待客户连接(在方法startlisten()中实现)。当接收到一个请求时,服务器立即启动一个新的线程来处理和该客户端的信息交互(在方法serviceclient()中实现)。自定义了一个client类,它用于保存每个当前在线用户的用户名和与服务器连接的socket对象。当socket连接一旦建立,就马上将其保存在一个client对象中,以便让每个用户有自己的socket,以后可以对不同用户的socket对象进行操作,实现与客户端的数据交换。
在服务器窗口中,单击“启动”按钮,进入btnstart_click处理程序。在该处理程序中,创建了一个服务器套接字并且监听本机ip地址中的一个指定的端口,同时启动一个线程等待用户连接(在方法startlisten()中实现)。startlisten()方法是在新的进程中进行的操作,它主要用于当接收到一个客户端请求时,确认与客户端的连接,并且立即启动一个新的线程来处理和该客户端的信息交互(在方法serviceclient()中实现)。serviceclient()方法用于和客户端进行数据通信,包括接收客户端的请求,根据不同的请求命令,执行相应的操作,并将处理结果返回到客户端,此方法完成了服务器的主要的工作。sendtoclient()方法实现了向客户端发送命令请求的功能,它利用不同用户保存的socket对象,向对应的用户发送命令请求。getuserlist()方法实现了获取当前在线用户列表的功能,它通过对clients数组的遍历,获取当前在线用户的用户名,用字符串发回。
2.客户端的实现
客户端是一个windows窗体应用程序,命名为chatclient。当运行客户端程序时,首先进入登录界面,输入用户名,单击“登录”按钮后,进入交谈主窗口(命名为login),在主窗口中可以向服务器发送信息,同时可以接收从服务器返回的信息。
(1)login.cs文件的实现
login.cs文件是登录窗体的代码文件,为了使用socket对象,在代码文件中加入名字空间system.net 、system.net..socket的引用,它主要实现了创建客户端套接字同时连接到服务器指定端口,把用户名和创建的客户端套接字传递给chatclient窗体。
(2)chatclient.cs文件的实现
chatclient.cs文件是客户端窗体(chatclient)的代码文件,在该文件中,首先获得与服务器通信的流通道,在用户登录后,向服务器发送conn命令以此说明有新的用户进入交谈室,服务器将返回所有的当前在线用户的呢称,选择不同的人,就可以与他们交谈了,如果选中“悄悄话”复选框,则具有私人交谈的功能。
当加载chatclient窗体时,便会进入chatclientform_load处理程序。在该处理程序中,首先显示用户登录窗口。如果登录成功,那么获取与服务器的连接并得到与服务器数据交互的流通道,向服务器发送conn请求命令,同时启动一个新的线程用于响应从服务器发回的信息(在方法serverresponse()中实现)。serverresponse()方法用于和服务器进行数据通信,主要是接收从服务器发回的信息,根据不同的命令,执行相应的操作。当需要进行“私人交谈” 时,便进入pricheckbox_checkedchanged处理程序。在该处理程序中主要对privatemode的布尔属性进行设置。当需要发送信息时,便会进入btnsend_click处理程序。在该处理程序中,如果privatemode的布尔属性值为false(不是私人交谈),将chat命令发送给服务器;否则(为私人交谈),将priv命令发送给服务器。当用户需要离开时,便进入了btnexit_click处理程序。在该处理程序中,将exit命令发送给服务器,停止交谈。
六、结束语
使用socket编程的关键技术可以方便地实现网上交谈工具。利用socket可以创建服务器程序和客户端程序。服务器监听本机ip地址中的一个指定的端口,建立与客户端的连接并启动一个新的线程来处理客户端的所有请求,执行相应的操作,并将处理结果返回给该客户端。客户端向远程服务器发送连接请求,得到服务器程序的确认后,建立与服务器的连接,并获得与服务器交互的流通道并通过网络流通道与服务器进行数据通信。我们可以进一步进行功能完善,进而编译成组件应用到自己的应用程序中,开发更完美的通信软件。
参考文献:
[1]谭桂华魏亮等:visual c#高级编程范例.北京:清华大学出版社,2004年5月
[2]吕伟臣霍言等:visual c# 2005入门与提高.北京:清华大学出版社,2006年9月
[3]邹建峰周山峰等:c#企业级开发案例精解.北京:人民邮电出版社,2006年1月