![c#网络编程(实例)_第1页](http://file4.renrendoc.com/view/7923f064a3ca8809efad491369ba8895/7923f064a3ca8809efad491369ba88951.gif)
![c#网络编程(实例)_第2页](http://file4.renrendoc.com/view/7923f064a3ca8809efad491369ba8895/7923f064a3ca8809efad491369ba88952.gif)
![c#网络编程(实例)_第3页](http://file4.renrendoc.com/view/7923f064a3ca8809efad491369ba8895/7923f064a3ca8809efad491369ba88953.gif)
![c#网络编程(实例)_第4页](http://file4.renrendoc.com/view/7923f064a3ca8809efad491369ba8895/7923f064a3ca8809efad491369ba88954.gif)
![c#网络编程(实例)_第5页](http://file4.renrendoc.com/view/7923f064a3ca8809efad491369ba8895/7923f064a3ca8809efad491369ba88955.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C#与VB.NET网络通信开发实战
第1章:套接字编程
编写网络应用程序是程序设计中最有趣的领域之•。眼看着自己编写的程序成功地通过
网络实现了通信,这是特别令人振奋的。在这一章里,我们将使用TCP/IP建立一个类似于
WindowsLiveMessenger(或ICQ)的聊天程序。通过这个聊天程序,你将学会如何在.NET
中进行网络编程,并了解建立多用户聊天程序时会遇到的种种挑战。
第2章:串行通信
串行通信是设备之间相互通信最古老的机制之一。从IBMPC及其兼容机开始,几乎所
有的计算机都配备了一个或多个串行端口和一个并行端口。顾名思义,串行端口(serialport)
每次1位地连续收发数据,而并行端口(parallelport)则使用8条独立的数据线每次收发8
位数据。尽管串行端口传输速度相对低于并行端口,但串行通信仍然是设备连接的流行选项,
因为它简单而且成本较低。虽然当今的消费产品正在使用USB连接取代串行连接,但是仍
有大量的设备把串行端口作为它们与外部世界连接的唯一途径。
这一章将介绍怎样使用.NETFramework2.0和.NETCompactFramework2.0里新的
SerialPort类实现与其他串行设备的通信。我们将建立3个项目,用实例说明怎样使用串行
通信。第一个项目是一个聊天程序,它允许(使用串行数据线或者蓝牙互相连接的)两台计
算机进行通信。你可以以此程序为基础,对其进行扩展来实现与手机之类的其他外部串行设
备的通信。你将学会如何通过一个串行的蓝牙连接使用AT命令通过程序来控制你的移动电
话。第二个项目是一个PocketPC聊天程序,与前一个项目上分类似。第三个项目展示了怎
样与GPS接收器通信,并从中提取有用的数据用于在地图上显示当前位置。
第3章:将指纹识别纳入.NET程序
生物特征识别是确认个体身份最可靠的方式之一。现在,应该有很多人已经熟悉了微软
指纹阅读器(MicrosoftFingerprintReader)。使用微软指纹阅读器,你只需把手指放在读取
器上,就能登录你的电脑。你也可以使用指纹阅读器提供的应用程序来为要求身份认证的网
站保存用户ID和密码。随后你就可以将指纹作为钥匙,取出ID和密码,安全地登录那些
站点.微软指纹读取器把需要为不同网站记住不同密码的烦恼一扫而尽。
在这一章,我们将说明如何使用GrFingerFingerprintSDK将微软指纹阅读器集成到你
的.NET2.0Windows应用程序中。我们将建立一个来访者鉴别系统,访问办公室的用户可以
使用它在接待处登记。登记以后,下一次他再访问办公室时,只需简单地扫描一下指纹,系
统就会记录他的来访。学校也可以改编这个程序用于考勤,比如在大型的阶梯教室等场合,
考勤必须快速而有效地实施。
第4章:红外线编程
在流行的如WiFi(WirelessFidelity,基于IEEE802.11b标准的无线局域网)、蓝牙和
其他无线技术的喧哗声中,有一种最简单而又最普遍的无线通信形式很容易被忽略——它就
是红外线通信。其实只要用过遥控器就己经用过这种通信形式。红外线通信使用超出光谱中
可见光红光的不可见波段。你可以在应用程序中利用它进行短程的、点到点的数据传输。因
为使用了光,所以光路是使用红外线通信的必要条件。尽管有此限制,红外线还是在数码相
机、PDA和笔记本电脑等设备中日益流行。
在这一章里,我们将讲解如何建立允许两台设备(及计算机)使用红外线进行无线通信
的应用程序。你可以将这•章中阐述的编程技术改造并应用到其他编程任务中,如编写无线
的网络游戏等。
第5章:RFID编程
射频识别(RadioFrequencyIdentifications,RFID)是近来在IT行业大力宣传的一•项技
术。RFID系统是•种识别系统,通过无线电波从称为电子标签(tag)或应答器(transponder)
的设备中接收数据。RF1D应用在日常生活中随处可见——超市、图书馆、书店等。RF1D
提供了一种快速而有效的方式来收集信息,如仓库的库存盘点、物品下落的追踪等。
在这一章,我们将介绍如何构建利用RFID技术进行数据采集的Windows应用程序。
我们将使用2个RFID阅读器并分析它们各自的优缺点。
第6章:与外围设备交互
摄像头是当今大多数人都可以轻易购置的普通外围设备,经常用于视频会议。但是,除
了视频会议以外,还可以用摄像头做些什么呢?对于.NET开发人员来说,答案非常多。而
且你会高兴地看到,将摄像头集成到Windows应用程序中并不像想象中那么难。
除了将摄像头集成到应用程序以外,还可以将Windows应用程序连接到诸如传感器这
样的外围设备,以监视周围环境的变化。
在这一章,我们通过将Windows程序与外围的传感器和摄像头接口,构建一个可以监
视有害活动的安全系统。你可以探测到入侵者,并用摄像头记录入侵者的行动。
目录
第1章套接字编程1
11套接字编程介绍1
12创建自己的多用户聊天应用程序2
121为网络通信使用TcpClient和
TcpListener类3
122构建服务器7
123构建客户16
124测试聊天应用程序23
13构建高级的多用户聊天应用程序24
131定义自己的通信协议24
132协议描述24
133功能一览25
134构建服务器28
135构建客户43
136测试应用程序65
14小结66
第2章串行通信67
21串行通信基础68
22使用串行端口聊天69
221硬件需求70
222构建聊天应用程序72
223创建SerialPort类的实例73
224列举所有可用的串口名73
225打开串口75
226断开串口连接77
227使用串口发送数据78
228接收串口上的数据79
229测试应用程序80
2210传输Unicode字符81
2211连接到其他串行设备82
23在PocketPC上使用串口聊天85
231硬件需求86
232构建应用程序86
233编写程序代码87
24用GPS接收器和微软虚拟地球创建地图程序91
241构建应用程序94
242创建包含虚拟地球地图的HTML文件94
243编写程序代码96
244显示地图的坐标100
245连接到GPS接收器103
25绘制保存的路径112
26小结118
第3章将指纹识别纳入NET程序119
31使用GrFingerSDK120
32创建应用程序120
321编写程序代码123
322连接所有控件125
323测试应用程序142
33小结144
第4章红外线编程171
41IrDA介绍171
42创建Windows移动设备之间的红外线通信172
421你所需要的172
422创建项目173
423编写程序代码174
424接收消息175
425显示接收到的消息179
426发送消息180
427编译并部署应用程序183
43建立桌面上的红外线通信184
431你所需要的184
432创建项目185
433导入命名空间186
434声明常量和成员变量187
435编写Form_Load()事件代码187
436编写ReceiveLoop()子程序188
437编写ReceiveMessage。函数189
438编写代理以及UpdateTextBox。
和UpdateStatus()子程序191
439编写SendMessage。子程序191
4310编写Send按钮控件的代码194
4311测试应用程序195
44小结195
第5章RFID编程197
51RFID介绍197
52构建考勤应用程序199
521RFID阅读器1:ParallaxRFID阅读器模块199
522RFID电子标签200
523阅读器的设置200
524构建应用程序用户界面202
525编写程序代码207
526测试应用程序220
527RFID阅读器2:PhidgetRFID221
528RFID电子标签221
529构建示例应用程序222
5210PhidgetRFIDAPI224
5211编写程序代码224
5212测试应用程序230
5213两种RFID阅读器的比较231
53小结231
第6章与外围设备交互233
61所使用的组件233
611传感器234
612摄像头234
62连接传感器到PC235
621连接PING传感器236
622PING传感器编程237
623与PC集成240
63摄像头的编程246
64小结255
1.1套接字编程介绍
第1章套接字编程
编写网络应用程序是程序设计中最有趣的领域之一。眼看着自己编写的程序成功地通过
网络实现了通信,这是特别令人振奋的。在这一章里,我们将使用TCP/IP建立一个类似于
WindowsLiveMessenger(或ICQ)的聊天程序。通过这个聊天程序,你将学会如何在.NET
中进行网络编程,并了解建立多用户聊天程序时会遇到的种种挑战。
1.1套接字编程介绍
套接字(socket)是网络计算机与应用程序之间发送和接收数据的方式的一种抽象描述。
它描述了(可能在不同的计算机上,也可能在同一台计算机内的)两个通信点之间的连接。
在实际操作中,套接字编程往往与TCP/IP和UDP/IP通信相结合(关于TCP/IP和UDP/IP
的更多信息参见下面的“理解IP、TCP和UDP”)。论及套接字编程时,以下3类信息是很
重要的:
协议(如TCP/IP或UDP/IP)o
IP地址(例如)。
端口号(例如端口80)。
举例来说,对于http//这样的地址,你应该比较熟悉,这个地址用来指示
Web浏览器加载位于的主页。http指定了使用的应用协议(HTTP使用TCP/IP
传输数据),指定了地址(名称将会被DN定艮务器解析成,'
个IP地址)。由于HTTP使用端口80进行通信,端口号80被隐式地指明,故没有出现在地
址里。如图
尽管有TCP/IP这样的协议负责把数据从一个点传输到另一个点,但所传输数据的内容则需
由诸如HTTP这样的应用协议来指定。
在.NETFramework里,套接字通信由Socket类来实现(该类位于System.Net.Sockets命名空
间)。
理解IP、TCP和UDP
对于网络编程来说,深入地理解当下正在使用的一些常见网络协议是很重要的。首先是
网际协议(InternetProtocol,IP)。IP指定了从一个点传送到另一个点的数据分组(如数据
报datagrams)的格式和寻址方案。假设1P是一种邮递系统,你可以通过它把邮件从一个地
方寄到另一个地方。你只需写上收件者地址并把邮件丢进邮箱里。随后邮局会试图把邮件投
递给收件人。但是,你不能确定你的邮件肯定会到达H的地,也不会知道它究竟何时到达。
为了确保邮件被正确地投递,你必须使用额外的服务,比如挂号信。与上述情形类似,
我们需要将其他协议与IP联合使用,以保证数据分组传送无误。传输控制协议(Transmission
ControlProtocol,TCP)正是这样一种协议。TCP是一种面向连接的网络协议,它(通过应
答机制)保证数据分组可靠并有序地传送。作为流行的网络协议,与IP协同工作的TCP已
被Web浏览器和电子邮件客户这样的应用程序广泛采用。
TCP确保了传送的正确性,但它也有不便的地方。正如要花更多的钱来寄送的挂号信
一样,TCP给被发送的数据分组加上了额外的报头,增大了分组的尺寸。因此,开发人员
有时会将用户数据报协议(UserDatagramProtocol,UDP)与IP联用。UDP是种无连接
的网络协议,同样把数据分组从一点发送到另一个点,只有一个例外——它并不提供可靠的、
有保障的传送。山于UDP不对传送提供保障,数据分组将包含更多的有效信息并能更快地
传送。使用UDP的开发人员必须建立自己的逻辑以确保数据分组的正确传送。这也与邮寄
的例子很相似:你可以自己给收件人打电话,看他们是否L1经收到你寄的邮件。如果他们没
有收到,你可能需要重新寄。对于那些传送小数据分组且不需要数据精确组装的应用程序来
说,UDP是非常有用的。这类程序包括简单文件传输协议(TrivialFileTransferProtocol,
TFTP)、域名系统(DomainNameSystem,DNS)以及语音IP(VoiceoverIP.VoIP)。
1.2创建自己的多用户聊天应用程序
1.2创建自己的多用户聊天应用程序
在本章的这一部分,我们将首先建立一个简单的聊天程序,它允许连接到中央服务器的
任何人互相进行通信。这样可以让你探索套接字通信的基本原理,并学习如何向所有已连接
的用户广播消息。
图1-2展示了本章的这一部分将要的建立的应用程序。
1.2.1为网络通信使用TcpClient和TcpListener类
创建聊天程序通常涉及套接字编程——创建•个客户和服务器之间的连接,使客户和服
务器都能发送和接收消息。System.Net.Sockets命名空间提供套接字编程所需的功能。在这
个项目我们将使用ISystem.Net.Sockets命名空间里的2个类:TcpClient和TcpListener。
TcpClient类实现了使用TCP发送和接收数据的套接字。因为与远程设备的连接被表示
为流,数据可以使用.NETFramework的流处理技术来读取和写入。
TcpListener类以阻塞同步模式提供用于监听和接受外来连接请求的简单方法。
下面的示例代码实现了一个简单的等待外来连接的服务器(一个控制台应用程号)o
classProgram
(
//---portnumbertouseforlistening---
constintportNo»SOO;
staticvoidMain(string(]args)
(
System.Net.IPAddresslocalAdd«
System.Net.IPAddress.Parse(n127.O.O.l");
//---listenatthelocaladdress---
TcpListenerlistener=newTcpListener(localAdd,portNo);
listener.Start();.com
//---Acceptsapendingconnectionrequest---
TcpClienttcpClient=listener.Accent!cptlient;
//---useaNetworkstreamobjecttosendandreceive
//data—
Networkstreamns=tcpClient.GetStream();
byte[]data=newbyte[tcpClient.ReceiveBufferSize];
//---readincomingstream;Read()isablockingcall---
intnumfiytesRead=ns.ReadCdata,0,
System.Convert.Tolnt32(tcpClient.ReceiveBufferSize));
//---displaydatareceived---
Console.WriteLine(MReceived:w♦
Encoding.ASCII.GetStringCdata,0,numBytesRead));
//---preventtheconsolewindowfromclosing
//immediately---
Console.ReadLine();
).com
要连接到服务器并向它发送•个字符串,客户代码(•个控制台应用程序)将是下面这样的:
C#2005
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
usingSystem.Net.Sockets;
namespaceClientCS
(
classProgram
{
constintportNo-SOO;
staticvoidMain(string(]args)
(
TcpClienttcpclient=newTcpClient();
//---connecttotheserver---
tcpclient.Coonect(-"»portNo);
//---useaNetworkstreamobjecttosendandreceive
//data---
Networkstreamns=tcpclient.GetStream();
byte(]data=Encoding.ASCII.GetBytes("Hello");
//---sendthetext---
ns.Write(data,0,data.Length);
}
}技术成就梦想
'---connecttotheserver---
tcpclient.Connect(n,\portNo)
'---useaNetworkStreamobjecttosendandreceivedata---
DimnsAsNetworkstream=tcpclient.GetStream
DimdataAsByte()«Encoding.ASCII.GetBytes("Hello")
,---sendthetext…
ns.WriteCdata,0,data.Length)31CTU.com
EndSub技术成就梦想
EndModule
注意,Networkstream对象操作字节数组,因而需要使用来自System.Text命名空间的
Encoding.ASCILGetStringO和Encoding.ASCH.GetBytes。方法来将字节数组转换成字符串,
反之亦然。
上面的例子是比较简单的——它包含了服务器代码和客户代码。服务器在12700.1使
用端口500打开一个套接字并监听外来TCP连接。当连接建立起来以后,由一个
NetworkStream对象读取客户发来的数据。到达的数据随后显示在控制台匕另方面,客
户在12700.1打开一个连接,然后使用NetworkStream对象向服务器发送一个字符串。
但是,当服务器需要同时与多个客户通信并能同时发送和接收消息时,问题就会变得复
杂得多。为了实现这些,必须满足以下几条。
服务器必须能够与多个客户建立连接。
服务器必须能够从客户异步读取数据并能在任何时刻向客户发送消息。
客户必须能够从服务器异步读取数据并能在任何时刻向服务器发送消息。
接下来的几节将解决这3个问题。
1.2.2构建服务器(1)
聊天程序有两个部件——服务器和客户,我们来首先构建服务器。用VistualStudio2005
创建一个控制台程序项目,将该项目命名为Server,
在默认的Module1.vb/Program.cs文件里,首先导入System.Net.Socket命名空间,它包
含这个项目将要用到的所有相关的类。
接下来,声明一个常量来存储这个应用程序使用的端口号。对这个程序,我们使用端口号
500o________________________________
VisualBasic2005
ModuleModulel
ConstportNoAsInteger=500
C#20Q5
classProgramLCOITI
《技术成就营印
constinf海rt府$0G;
提示如果你在服务器(或者客户)上安装了防火墙,请确保打开端口500,以便这个应
用程序运行。
我们还需要定义所要监听的本地地址,然后创建一个TcpListener类的实例,用来监听
来自TCP客户的连接。
Visualliasic2005
SubMain。
DimlocalAddAsSystem.Net.IPAddress«.
System.Net.IPAddress.Parse("")
DimlistenerAsNewTcpListener(localAdd,portNo)
C#2005
staticvoidMain(string[]args)
System.Net.IPAddresslocalAdd»
System.Net.IPAddress.Parse("127.O»O.1T)
TcpListenerlistenernewTcpListeherfiocaiAdd,portNo);
在Main。函数里,使用来自类TcpListener的Strart()方法来开始监听外来连接请求。
AcceptTcpClientO方法是一个阻塞式的调用,直到连接建立起来以后程序才会继续执行。因
为这个示例里的服务器需要同时为多个客户提供服务,我们将为每一个用户创建一个
ChatClient类(稍后将定义)的实例。服务器将会无限地循环检查,若有客户请求连接,则
接受。
VisualBasic20()5
SubMain()
DimlocalAddAsSystem.Net.IPAddress«_
System.Net.IPAddress.Parse("*)
DimlistenerAsNewTcpListener(localAdd,portNo)
listener.Start()
WhileTrue
DimuserAsNewChatClient(listener.AcceptTcpClient)
EndWhile
EndSub
C#2005
staticvoidMain(string(]args)51CT0.com
System.Net.IPAddresslocalAdd;
System.Net.IPAddress.Parse("127.6.d'i"y;
TcpListenerlistener=newTcpListenerClocalAdd,portNo);
listener.Start。;
while(true)
ChatClientuser=new
ChatClient(listener・AcceptTcpClient());
)技术成就梦想
完整的Modulel.vb源文件如下所示。
DimuserAsNewChatClient(listener.AcceptTcpClient)
EndWhile
EndSub
EndModule
CW2005
usingSystem;
usingSystem.Collections.Generic;
usingSystefn.Text;
usingSystem.Net.Sockets;
classProgram
constintportNo-SOO;
staticvoidHain(string(]args)
Syste«n.Net,IPAddresslocalAdd-
System.Net.IPAddress.Parse(-");
TcpListenerlistener-newTc|plistenerClocaLAxld,portNa);
listener.Start();
while(true)技术成就梦想
ChatClientuser«new
ChatClient(1istener.AcceptTcpC1lent());
}}
}6I1jta
接下来定义ChatClient类。我们使用ChatClient类来表示连接到该服务器的每个客户的
信息。
在VisualStudio2005中为项目添加一个新的类,并将其命名为
ChatClient.vb/ChatClient.cSo照例,第一步是导入System.Net.Sockets命名空间(对于代码的
C#版本,还需要导入System.Collections命名空间)。
VisualBasic2005
ImportsSystem.Net.Sockets
RMCTOxom
usin^Syste^Net-SockeU;
usingSyitem.Collectiorti;
L2.2构建服务器(2)
在ChatClient类中,首先定义各种私有成员(它们的用途在代码注释中会有说明)。同
时声明一个HashTablc对象(AllClients),用来保存所有连接到该服务器的用户的列表。将
它声明为共享成员的原因是,确保ChatClient类的所有实例都能够获得当前连接到该服务器
的所有客户的列表。
C#2005
classChatClient
(
//---containsalistofalltheclients--
publicstaticHashtableAllClients=newHashtable。;
//---informationabouttheclient---
privateTcpClient-client;
privatestringclientIP;
privatestring_clientNick;
//---usedforsending/receivingdata---
privatebyte(]data;
WluIUavUIII
//---isthenicknamebeingsent2---
privateboolReceiveNick■true;,"
当一个客户连接到服务器时,服务器将创建一个ChatClient类的实例,并将变量TcpClient
(client)传递给类的构造函数。同时,我们取得客户的IP地址并将它用作索引来标识
HashTablc对象中的客户。BeginRead。方法将在独立的线程中启动一个从NetworkStrcam对
象(client.GetStream)的异步读取。这样可以使服务器保持响应能力并继续接受来自其他客
户的新连接。读取完成以后,控制将被转移到ReceiveMessage。函数(此函数稍后将会定义)。
C#2005
publicChatClient(TcpClientclient)
(
_client»client;
//——gettheclientIPaddress—
_clientIP«client.Client.RemoteEndPoint.ToString();
//—addthecurrentclienttothehashtable—
AllClients.Add(_clientIP,this);
//—startreadingdatafromtheclientina
//separatethread—
data»newbyte[__client.ReceiveBufferSize];
client.GetStrean»().BeginRead(data»0,
System.Convert.ToInt32(_client.ReceiveBufFerSi,
ReceiveMessage,null);
在ReceiveMessage。函数中,首先调用EndRcad。方法来处理异步读取的结尾。在这里,我
们将检查读取的字节数是否小于1。如果是,则意味着客户已经断开连接,那么我们需要从
HashTable对象中(使用客户的IP地址作为表中的索引)删除该客户,同时使用Broadcast。
函数(此函数稍后定义)向所有客户广播消息,告知这一特定客户已经离开了聊天。为了简
单起见,假设客户会在第一次连接到服务器时发送他的昵称。此后,只需向所有人广播该客
户发出的所有信息。一旦完成,服务器将再次执行从该客户的异步读取。
Broadcastt-dientNick&_
"hasleftthechat.")
EndTry
EndSub
02005
publicvoidReceiveMessage(IAsyncResultar)
(
//-readfromclient--
intbytesRead;
try
{
lock(client.GetStrea<n())
{一
bytesRead=_client.GetStreamO.EndReadtar^g
//---clienthasdisconnected---
if(bytesRead<1)
(
AllClients.RemoveC-clientlP);
Broadcast(clientNick♦"hasleftthechat.");
return;
}
else
(
//---getthemessagesent---
stringmessageReceived«
System.Text.Encoding.ASCII.GetString(
data,0,bytesRead);
//---clientissendingitsnickname---
if(ReceiveNick)
(
-clientNick=messageReceived;
//-telleveryoneclienthasenteredthe
//chat…
BroadcastC-clientNick♦
"hasjoinedthechat.");
ReceiveNick■false;I.rs
else、;xn
//--broadcastthemessagetoeveryone---
Broadcast^clientNick+♦
messageReceived);
}
)
//---continuereadingfromclient---
lock(client.GetStream())
(
-dient.GetStreamO.BeginReadCdata,Q,
System.Convert.Tolnt32(
_client.ReceiveBufferSize),ReceiveMessage,
null);
}
)
catch(Exceptionex)
(
AllClients.Remove(_clientIP);
Broadcast(clientNick+"hasthe
}拈犬由就譬相
上面的代码里需要注意的一个问题是,需要使用SyncLock(C#中的lock)语句来阻止
多个线程同时使用Networkstream对象。当服务器连接到多个客户而且它们全都在同一时刻
试图访问Networkstream对象时,这一情况就可能会出现。
SendMessage。函数允许服务器向客户发送消息。
C#2005
publicvoidSendMessage(stringmessage)
(
try
(
//---sendthetext--
System.Net.Sockets.NetworkStreamns;
lock(c1ient.GetStream())
(
ns■client.GetStream();
byte[]bytesToSend•
System.Text.Encoding.ASCII.GetBytes(message);
ns.Write(bytesToSend,0,bytesToSend.Length);
ns.Flush();
)
catch(Exceptionex)
{RinTf)Af|m
Console.WriteLine(ex.ToStringO);
}技术成就梦想
最后,Broadcast。函数向存储在AllClientsHashTable对象中的所有客户发送消息。
VisualBasic2005
PublicSubBroadcast(ByVaimessageAsString)
itlocally---
Console.WriteLine(message)
DimcAsDictionaryEntry
ForEachcInAllClients
,---broadcastmessagetoallusers--
CType(c.Value,_
ChatClient).SendHessage(message&vblf)
Next
EndSub
0^2005
publicvoidBroadcast(stringmessage)
(—I
//--•logitlocally---Lcom
Console・WiriteLine(messa喂;才.金筵桢
foreach(DictionaryEntry^vftAHCnenS)
//--broadcastmessagetoallusers--
((ChatClient)(c,Value)
message♦Environment.MewLire)>;
1.2.3构建客户(D
现在服务器已经构建起来,接下来构建客户。使用VisualStudio2005创建个新的
Windows应用程序(将它命名为WinClient),并在默认窗体上放置如图1-3所示的控件。
设置txtMessageHistory控件的MultiLine和Readonly属性为True,并设置其ScrollBars属
性为Vertical。同时,设置btnSend控件的Enabled属性为False。
Label*'TextBo掇件。
控件+,(txtNick)“
ButtonJS件3
(btnSignln)
TextBo炮件”
(txtMessageHistory)
.com
TextBo播件+Butto侬件.
(txtMessage)(btnSend)“
(点击查看大图)图1-3在Windows窗体上放置控件
客户应用程序的逻辑与服务器类似,不过更加直接。双击式单切换到编辑窗口,导入以下命
名空间。
VisualBasic2005
ImportsSystem.Net.Sockets
。#2颂51CT0.com
usingSystem.Net.Sockets;
在类Forml里定义下列常量和变量。
C#2005
publicpartialclassForml:Form
(hlpinpnm
constintportNo»500;
TcpClientclient;
byte[]data;/L>
当用户登录时,程序会首先连接到服务器并使用SendMessage。子程序发送用户的昵称,然
后开始从服务器异步读取数据并将按钮的名称改为SignOuto当用户从聊天应用程序退出
时,调用Disconnect。子程序。
C#2M5
privatevoidbtnSignIn_Click(objectsender,EventArgse)
(
if(btnSignln.Text»»"SignIn")
(
try
(
//---connecttoserver--
client=newTcpClient();
client.Connect(-",portNo);
data»newbyte(client.ReceiveBufferSize];
//---readfromserver---
SendMessage(txtNick.Text);
client.GetStream().BeginRead(data,0,
System.Convert.Tolnt32(
client.ReceiveBufferSize),
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度航空航天设备研发与制造合同范本-@-1
- 2025年度在线教育平台服务续约协议
- 2025年定制化IDC解决方案合同标的协议
- 2025年度广告代理合同补充协议书模板(含广告效果评估)
- 2025年度跨区域医疗服务合作框架合同样本
- 2025年度跨境电商进口货物国际货运运输合同范本
- 2025年度售楼处物业服务合同范本:智能家居售楼处品牌推广
- 2025年度涵管施工与地下空间安全监测合同范本
- 2025年度工地食堂食品安全教育与培训合同
- 现代企业办公环境与效率创新实践
- 工程设计方案定案表
- 第一章-天气图基本分析方法课件
- 虚位移原理PPT
- 暖气管道安装施工计划
- 初二物理弹力知识要点及练习
- QE工程师简历
- 复合材料成型工艺及特点
- 辅音和辅音字母组合发音规则
- 2021年酒店餐饮传菜员岗位职责与奖罚制度
- 最新船厂机舱综合布置及生产设计指南
- 可降解塑料制品项目可行性研究报告-完整可修改版
评论
0/150
提交评论