logo资料库

C#网络游戏编程完整教程.pdf

第1页 / 共201页
第2页 / 共201页
第3页 / 共201页
第4页 / 共201页
第5页 / 共201页
第6页 / 共201页
第7页 / 共201页
第8页 / 共201页
资料共201页,剩余部分请下载后查看
目 录
前 言
第1章 进程、线程与网络协议
1.1 进程和线程
1.1.1 Process类
【例1-1】启动、停止和观察进程。
1.1.2 Thread类
1. 启动线程
2. 终止线程
3. 合并线程
4. 让线程休眠
5. 线程优先级
6. 线程池
7. 同步
1.1.3 在一个线程中操作另一个线程的控件
1.2 IP地址与端口
1.2.1 TCP/IP网络协议
1.2.2 IPAddress类与Dns类
1.2.3 IPHostEntry类
1.2.4 IPEndPoint类
【例1-4】IPAddress类、Dns类、IPHostEntry类和IPEndPoint类的使用方法。
1.3 套接字
1.3.1 Socket类
表1-1 IP套接字定义组合
表1-2 套接字常用属性
表1-3 套接字常用选项值
1.3.2 面向连接的套接字
表1-4 Receive方法和Send方法
表1-5 SocketFlag的值
表1-6 Socket.ShutDown值
1.3.3 无连接的套接字
1.4 网络流
表1-7 NetworkStream类的常用属性
表1-8 NetworkStream类的常用方法
网络数据传输完成后,不要忘记用Close方法关闭NetworkStream对象。
1.5 习题1
1. 简要回答下列问题。
1) 进程和线程有什么区别?
2) 线程是如何创建的?怎样设置线程的优先级?
3) 什么是套接字?
2. 使用DNS类和IPHostEntry类创建一个如图1-10所示的域名解析器。用户输入主机名或者DNS域名以后,能在下面的列表框中显示与主机或者DNS域名对应的IP地址和别名。
图1-1 测试进程界面
图1-2 例1-2的设计界面
图1-3 例1-2的运行界面
图1-5 例1-3的运行界面
图1-4 例1-3的设计界面
图1-6 例1-4的设计界面
说明
Dgram
Udp
无连接通信
Stream
Tcp
面向连接的通信
Raw
Icmp
Internet控制报文协议
Raw
Raw
简单IP包通信
ProtocolType
SocketType
说明
AddressFamily
获取套接字的Address family
Avilable
从网络中获取准备读取的数据数量
Blocking
获取或设置表示套接字是否处于阻塞模式的值
Connected
获取一个值,该值表明套接字是否与最后完成发送或接收操作的远程设备得到连接
LocalEndPoint
获取套接字的本地EndPoint对象
ProtocolType
获取套接字的协议类型
RemoteEndPoint
获取套接字的远程EndPoint对象
SocketType
获取套接字的类型
属性
说明
IP
AddMembership
增加一个IP组成员
IP
HeaderIncluded
指出发送到套接字的数据将包括IP头
IP
IPOptions
指定IP选项插入到输出的数据包中
IP
MulticastInterface
设置组播包使用的接口
IP
MultiLoopBack
IP组播回送
IP
PacketInformation
返回关于接收包的信息
IP
UnBlockSource
设置套接字为无阻塞模式
Socket
AcceptConnection
如果为真,表明套接字正在侦听
Socket
Broadcast
如果为真,表明允许在套接字上发送广播消息
Socket
MaxConnections
设置使用的最大队列长度
Socket
PacketInformation
返回接收到的套接字信息
Socket
ReceiveBuffer
接收套接字的缓存大小
Socket
ReceiveTimeout
接收套接字的超时时间
Socket
SendBuffer
发送套接字的缓存大小
Socket
SendTimeout
发送套接字的超时时间
Socket
Type
获取套接字的类型
Socket
UseLookback
使用回传
Tcp
NoDelay
为发送合并禁用 Nagle 算法
Udp
ChecksumConverage
设置或获取 UDP 校验和覆盖
Udp
NoChecksum
发送校验和设置为零的 UDP 数据报
SocketOptionName
SocketOptionLevel
图1-7 面向连接的套接字编程
服务器端 客户端
Socket()
Connect()
Send()
Receive()
Close()
Socket()
Bind()
Listen()
Accept()
Receive()
Send()
Close()
说明
Receive(byte[] data)
接收数据放到接收缓冲器中
Receive (Generic IList data)
接收数据放到接收缓冲器列表中
Receive(byte[] data, SocketFlgs sf)
接收数据放到接收缓冲器中,并设置套接字标志
Receive (Generic IList data, SocketFlags sf)
接收数据放到接收缓冲器列表中,并设置套接字标志
Receive(byte[] data, int size, SocketFlgs sf)
接收指定容量的数据放到接收缓冲器中,并设置套接字标志
Receive(byte[] data, int offset, int size, SocketFlgs sf)
接收一定容量的数据放到接收缓冲器中指定偏移量位置,并设置套接字标志
Send(byte[] data)
向一个已连接的套接字发送数据
Socket.Send (Generic IList data)
向一个已连接的套接字发送在列表中的磁盘缓存块数
Send (byte[] data, SocketFlgs sf)
向一个已连接的套接字发送数据,并设置套接字标志
Socket.Send (Generic IList data, SocketFlags sf)
向一个已连接的套接字发送在列表中的磁盘缓存块数,并设置套接字标志
Send (byte[] data, int size, SocketFlgs sf)
发送一定容量的指定类型的数据,并设置套接字标志
Send (byte[] data, int offset, int size, SocketFlgs sf)
发送从某处开始的一定容量的指定类型的数据,并设置套接字标志
方法
说明
DontRoute
不用内部路由表发送数据
MaxIOVectorLength
给用于发送和接收数据的WSABUF结构数提供一个标准值
None
对这次调用不使用标志
OutOfBind
处理带外的数据
Partial
部分的发送或接收信息
Peek
只对进入的消息取数
说明
SocketShutdown.Receive
防止在套接字上接收数据,如果收到额外的数据,将发出一个RST信号
SocketShutdown.Send
防止在套接字上发送数据,在所有存留在缓冲器中的数据发送出去之后,发出一个FIN信号
SocketShutdown.Both
在套接字上既停止发送也停止接收
NetworkStream
接收端
来源端
图1-9 NetworkStream流的数据传输
图1-8 无连接套接字编程
设备2
设备1
Socket()
Bind()
SendTo()
ReceiveFrom()
Close()
Socket()
Bind()
ReceiveFrom()
SendTo()
Close()
说明
CanRead
指示NetworkStream是否支持读操作,默认值为True
CanWrite
指示NetworkStream是否支持写操作,默认值为True
CanSeek
指示NetworkStream流是否支持查找,该属性总是返回False
DataAvailable
指示NetworkStream上是否有可用的数据,有则为真
Position
获取或设置流中的当前位置,此属性始终引发NotSupportedException
Readable
指示NetworkStream流是否可读,为真时可读;假时不可读
Writeable
指示NetworkStream流是否可写,为真时可写;假时不可写
属性
说明
BeginRead方法
从NetworkStream流开始异步读取
BeginWrite方法
开始向NetworkStream流异步写入
EndRead方法
结束对一个NetworkStream流的异步读取
EndWrite方法
结束向一个NetworkStream流的异步写入
Read方法
从NetworkStream流中读取数据
Write方法
向NetworkStream流中写入数据
ReadByte方法
从NetworkStream流中读取一个字节的数据
WriteByte方法
向NetworkStream流中写入一个字节的数据
Flush方法
从NetworkStream流中取走所有数据
Close方法
关闭NetworkStream对象
Dispose方法
释放NetworkStream占用的资源
Seek方法
查找NetworkStream流的当前位置,此方法将引发NotSupportedException
方法
图1-10 第2题设计界面
第2章 TCP应用编程
2.1 同步TCP应用编程
2.1.1 使用套接字发送和接收数据
1. 服务器端编程关键代码
2. 客户端编程关键代码
2.1.2 使用NetworkStream对象发送和接收数据
2.1.3 TcpClient与TcpListener类
1. TcpClient类
表2-1 TcpClient类的常用属性
表2-2 TcpClient类的常用方法
2. TcpListener类
2.1.4 解决TCP协议的无消息边界问题
2.2 利用同步TCP编写网络游戏
【例2-1】编写一个可以通过因特网对弈的“吃棋子”游戏。游戏功能要求:
2.2.1 服务器端编程
2.2.2 客户端编程
2.3 异步TCP应用编程
表2-3 TcpListener和TcpClient及Socket提供的部分异步操作方法
2.3.1 EventWaitHandle类
2.3.2 AsyncCallback委托
2.3.3 BeginAcceptTcpClient方法和EndAcceptTcpClient方法
2.3.4 BeginConnect方法和EndConnect方法
2.3.5 发送数据
2.3.6 接收数据
2.4 异步TCP聊天程序
【例2-2】编写一个异步聊天系统,系统只允许客户与服务器相互传送字符串数据,不实现任意客户之间的直接信息传递。服务器要允许多个客户同时向服务器发送字符串,服务器也可以随时向任意一个指定的客户发送信息。
2.4.1 服务器端设计
2.4.2 客户端设计
2.5 习题2
含义
Client
获取或设置基础套接字
LingerState
获取或设置套接字保持连接的时间
NoDelay
获取或设置一个值,该值在发送或接收缓冲区未满时禁用延迟
ReceiveBufferSize
获取或设置Tcp接收缓冲区的大小
ReceiveTimeout
获取或设置套接字接收数据的超时时间
SendBufferSize
获取或设置Tcp发送缓冲区的大小
SendTimeout
获取或设置套接字发送数据的超时时间
属性
含义
Close
释放TcpClient实例,而不关闭基础连接
Connect
用指定的主机名和端口号将客户端连接到TCP主机
BeginConnect
开始一个对远程主机连接的异步请求
EndConnect
异步接受传入的连接尝试
GetStream
获取能够发送和接收数据的NetworkStream对象
方法
图2-1 吃棋子游戏服务器端界面设计
图2-3 FormRoom设计界面
图2-2 棋子与棋盘
图2-4 客户端FormPlaying.cs的设计界面
(b) 客户端游戏室界面示例
(a) 服务器端界面示例
图2-5 服务器和客户端的部分运行界面效果
(c) 黑方玩家的界面示例 (d) 白方玩家的界面示例
图2-6 玩家坐到座位上后双方对弈的界面效果
说明
TcpListener
BeginAcceptTcpClient
开始一个异步操作接受一个传入的连接尝试
EndAcceptTcpClient
异步接受传入的连接尝试,并创建新的TcpClient处理远程主机通信
TcpClient
BeginConnect
开始一个对远程主机连接的异步请求
EndConnect
异步接受传入的连接尝试
Socket
BeginReceive
开始从连接的Socket中异步接收数据
EndReceive
结束挂起的异步读取
BeginSend
将数据异步发送到连接的Socket
EndSend
结束挂起的异步发送
方法
含义
Send()
发送数据报
Receive()
接收数据报
BeginSend()
开始从连接的socket中异步发送数据报
BeginReceive()
开始从连接的socket中异步接收数据报
EndSend()
结束挂起的异步发送数据报
EndReceive()
结束挂起的异步接收数据报
JoinMulticastGroup()
添加多地址发送,用于连接一个多组播
DropMulticastGroup()
除去多地址发送,用于断开UdpClient与一个多组播的连接
Close()
关闭
Dispose()
释放资源
属性
含义
Active
获取或设置一个值指示是否已建立默认远程主机。
Available
获取或设置缓冲器中可用数据报的数量
Client
获取或设置基础网络套接字
EnableBroadcast
是否接收或发送广播包
ExclusiveAddressUSe
是否仅允许一个客户端使用指定端口
提供的方法
图2-7 FormServer.cs的设计界面
图2-8 FormClient.cs的设计界面
图2-9 异步TCP聊天服务器和客户端部分运行效果
第3章 UDP应用编程
3.1 UDP协议基础知识
3.2 UDP应用编程技术
3.2.1 UdpClient类
1.UdpClient的构造函数
2.UdpClient的常用方法和属性
表3-1 UdpClient的常用方法
表3-2 UdpClient的常用属性
3.2.2 发送和接收数据的方法
1. 发送数据
2. 接收数据
【例3-1】UdpClient使用示例——UDP网络聊天工具。
3.3 利用UDP协议进行广播和组播
3.3.1 通过Internet实现群发功能
1.利用广播实现群发功能
【例3-2】编写一个Windows应用程序,向子网发送广播信息,同时接收子网中的任意主机发送的广播信息。
2.利用组播实现群发功能
【例3-3】编写一个Windows应用程序,利用组播技术向子网发送组播信息,同时接收组播的信息。
3.3.2 在Internet上举行网络会议讨论
【例3-4】编写一个Windows应用程序,利用组播技术进行网络会议讨论。
3.4 习题3
图3-1 例3-1设计界面
图3-2 例3-1的运行效果
图3-3 例3-2的设计界面
图3-4 例3-3的设计界面
图3-5 例3-4的设计界面
第4章 P2P应用编程
4.1 P2P基础知识
4.2 P2P应用举例
【例4-1】使用P2P技术设计一个简易聊天程序,要求不使用专用的主服务器,只要将好友添加到好友列表中,就能检测到好友是否在线,并相互发送聊天信息。
4.3 习题4
图4-1 FormP2P.cs的设计界面
第5章 SMTP与POP3应用编程
5.1 通过应用程序发送电子邮件
5.1.1 SMTP协议
① MAIL FROM:<发信人的地址>,告诉SMTP服务器发信人的地址。
② RCPT TO:<收信人的地址>,告诉SMTP服务器收信人的地址。
① FROM:<姓名><邮件地址>,表明邮件发送者是谁。
② TO:<姓名><邮件地址>,表明邮件接收者是谁。
③ SUBJECT:<邮件标题>,表明邮件的主题。
④ DATE:<时间>,表明发邮件的时间。
⑤ REPLY-TO:<邮件地址>,表明邮件的回复地址。
⑥ Content-Type:<邮件类型>,表明邮件包含文本、HTML超文本和附件的哪些类型。
⑦ X-Priority:<邮件优先级>,表明邮件的发送优先级。
⑧MIME-Version:<版本>,MIME的意思是Multipurpose Internet Mail Extensions,即多用途Internet邮件扩展标准,它对传输内容的消息、附件及其他的内容定义了格式。
5.1.2 发送邮件
5.2 利用同步TCP接收电子邮件
5.2.1 POP3工作原理
1. 授权状态
1) 发送用户名。
2) 用户名确认成功后,需要输入密码。
2. 操作状态
(1) STAT命令
(3) RETR命令
注意,这里的“.”是单独发送的。
(4) DELE命令
3. 更新状态
5.2.2 邮件接收处理
【例5-2】利用POP3协议和同步TCP编写一个简单的邮件接收客户端程序。
5.3 习题5
图5-1 例5-1的设计界面
图5-2 例5-2的设计界面
第6章 网络数据加密与解密
6.1 对称加密
表6-1 四种对称加密类的主要特点
表6-2 TripleDESCryptoServiceProvider类常用的属性和方法
6.2 不对称加密
表6-3 RSACryptoServiceProvider类的部分属性和方法
【例6-2】利用不对称加密算法加密指定的字符串,并输出加密和解密后的结果。
6.3 通过网络传递加密数据
1. 服务器端设计
2. 客户端设计
6.4 Hash算法与数字签名
6.5 习题6
加密算法
DESCryptoServiceProvider
64
DES加密算法
RC2CryptoServiceProvider
40-128(每8位递增)
RC2加密算法
RijndaelManaged
128-256(每64位递增)
Rijndael加密算法
TripleDESCryptoServiceProvider
128-192(每64位递增)
三重DES加密算法
可用密钥长度(bit)
解释
BlockSize属性
获取或设置加密操作的快大小,以位为单位
Key属性
获取或设置TripleDES算法的机密密钥
IV属性
获取或设置TripleDES算法的初始化向量
KeySize属性
获取或设置TripleDES算法所用密钥的大小,以位为单位
CreateEncryptor方法
创建TripleDES加密器对象
CreateDecryptor方法
创建TripleDES解密器对象
GenerateIV方法
生成用于TripleDES算法的随机初始化向量IV
GenerateKey方法
生成用于TripleDES算法的随机密钥
名称
图6-1 例6-1的设计界面
图6-2 例6-1的运行效果
解释
CspKeyContainerInfo 属性
检索关于加密密钥对的相关信息,比如密钥是否可导出、密钥容器名称以及提供程序的信息等
PersistKeyInCsp属性
获取或设置一个值,该值指示密钥是否应该永久驻留在加密服务提供程序(CSP)中。当在CspParameter对象中指定密钥容器名称并用其初始化RSACryptoServiceProvider对象时,PersistKeyInSsp属性自动设置为true
PublicOnly属性
获取一个值,该值指示RSACryptoServiceProvider对象是否仅包含一个公钥。如果 RSACryptoServiceProvider对象仅包含一个公钥,则为true,否则为false
Encrypt方法
使用RSA算法对数据进行加密。该方法有两个参数,第一个参数是被加密的字节数组;第二个参数是填充方式(true表示使用OAEP方式填充,false表示使用PKCS#1 1.5版填充),如果操作系统是Windows XP及其以上版本,可以使用true,如果是Windows 2000及其以上版本,使用false
Decrypt方法
使用RSA算法对数据进行解密
ImportParameters方法
导入指定的RSAParameters。RSAParameters表示RSA算法涉及的相关参数
ExportParameters方法
导出指定的RSAParameters
FromXmlString方法
通过XML字符串中的密钥信息初始化RSA对象。该XML字符串是使用ToXmlString方法生成的。FromXmlString方法既可接受包含公钥的XML字符串,也可接受包含公钥和私钥的XML字符串
ToXmlString方法
创建并返回包含当前RSA对象的密钥的XML字符串。该方法有一个布尔型参数,true表示同时包含RSA公钥和私钥,false表示仅包含公钥
名称
图6-3 例6-2的设计界面
图6-4 例6-2的运行效果
图6-5 数据加密与解密的网络传输过程
buttonStart
textBoxSend
comboBoxReceiver
listBoxStatus
buttonStop
buttonSend
图6-6 服务器端设计界面
图6-7 客户端设计界面
图6-8 例6-3的运行效果
第7章 三维设计与多媒体编程
7.1 简单的3D设计入门
【例7-1】使用DirectX设计一个能够旋转的三角形,并将本机显卡和显示器的相关参数显示出来。
7.2 DirectX基础知识
7.2.1 左手坐标系与右手坐标系
7.2.2 设备
7.2.3 顶点与顶点缓冲
7.2.4 Mesh对象
7.2.5 法线
7.2.6 纹理与纹理映射
7.2.7 世界矩阵、投影矩阵与视图矩阵
7.2.8 背面剔除
7.3 Primitive
【例7-2】演示Primitive的绘制方法。
7.4 Mesh
【例7-3】演示Mesh对象的绘制方法。
7.5 灯光与材质
该语句的意思是设置首个直射光的方向为z轴正方向。
【例7-4】灯光、材质、Primitive和Mesh综合举例。
7.6 音频与视频
【例7-5】制作一个音频视频播放器,具有播放、暂停、停止等功能。
7.7 直接使用SoundPlayer类播放WAV音频文件
【例7-6】演示SoundPlayer的使用方法。
7.8 习题7
图7-1 例7-1的运行效果
图7-3 三角形面
图7-2 前剪裁面与后剪裁面
图7-4 Direct3D中的六种Primitive
(a) 点列 (b) 线列
(c) 线带 (d) 三角形列
图7-5 六种基本的Primitive运行效果
(a) 点列 (b) 线列 (c) 线带 (d) 三角形列 (e) 三角形带 (f) 三角扇形
(e) 三角形带 (f) 三角扇形
图7-6 例7-3的运行界面
(a) 多材质、直射光 (b) 多材质、无灯光 (c) 多材质、点光源
(d) 增加小球后的效果 (e) 增大小球半径后效果 (f) 单一材质效果
图7-7 例7-4的部分运行界面
图7-8 例7-5的设计界面
图7-9 例7-5的运行效果
图7-10 例7-6的设计界面
第8章 上机实验指导
上机实验环境
实验报告要求
8.1 实验一 简单网络聊天系统
实验目的
实验内容
实验要求
实验步骤提示
实验报告中要求回答的问题
8.2 实验二 网络呼叫应答提醒系统
实验目的
实验内容
实验要求
实验步骤提示
实验报告中要求回答的问题
8.3 实验三 文件数据加密与解密
实验目的
实验内容
实验步骤提示
实验报告中要求回答的问题
图8-1 服务器端设计界面
图8-2 客户端设计界面
图8-4 屏幕右下方显示的托盘图标
图8-3 呼叫窗体
图8-5 实验三设计界面
图8-6 实验三运行界面
21 世纪高等学校计算机应用技术系列规划教材 C#网络应用高级编程 马 骏 编著 人民邮电出版社 1
内容提要 本书是《C#网络应用编程基础》的姊妹篇。该书在《C#网络应用编程基础》介绍的基础 知识之上,进一步讲解了利用 C#进行各种高级应用编程的方法和技巧。全书语言简洁,重点 突出,思路清晰,实用性强。教材紧跟 C#和 Microsoft Visual Studio 开发工具最新版本的变化 而及时更新。同时有与本书配套的实验指导、电子教案、所有例题与习题的源程序和全部习题 参考解答。 本书共分 8 章。其中第 1~5 章介绍了 C#多线程处理、TCP、UDP、SMTP 和 POP3 协议 的高级应用以及 P2P 应用编程,第 6 章介绍了网络数据加密与解密的方法,第 7 章介绍了三 维设计与多媒体编程方法,第 8 章为与本书配套的上机实验指导。 本书可作为高等院校计算机及相关专业的高年级学生教材,也适用于有一定的 C#语言编 程基础,而想利用 C#和 VS2005 开发工具进行更复杂的高级应用编程的人员阅读。 2
目 录 前 言 .............................................................................................................................................. 6 第 1 章 进程、线程与网络协议 ....................................................................................................... 7 1.1 进程和线程.......................................................................................................................... 7 1.1.1 Process 类 ................................................................................................................. 7 1.1.2 Thread 类 .................................................................................................................. 9 1.1.3 在一个线程中操作另一个线程的控件 ................................................................. 13 1.2 IP 地址与端口 ................................................................................................................... 15 1.2.1 TCP/IP 网络协议 .................................................................................................... 16 1.2.2 IPAddress 类与 Dns 类 ........................................................................................... 17 1.2.3 IPHostEntry 类 ........................................................................................................ 17 1.2.4 IPEndPoint 类 ......................................................................................................... 17 1.3 套接字 ............................................................................................................................... 19 1.3.1 Socket 类 ................................................................................................................. 20 1.3.2 面向连接的套接字 ................................................................................................. 21 1.3.3 无连接的套接字 ..................................................................................................... 23 1.4 网络流 ............................................................................................................................... 24 1.5 习题 1 ................................................................................................................................ 25 第 2 章 TCP 应用编程 .................................................................................................................... 27 2.1 同步 TCP 应用编程 .......................................................................................................... 28 2.1.1 使用套接字发送和接收数据 ................................................................................. 28 2.1.2 使用 NetworkStream 对象发送和接收数据 .......................................................... 30 2.1.3 TcpClient 与 TcpListener 类 ................................................................................... 31 2.1.4 解决 TCP 协议的无消息边界问题........................................................................ 33 2.2 利用同步 TCP 编写网络游戏 .......................................................................................... 34 2.2.1 服务器端编程 ......................................................................................................... 34 2.2.2 客户端编程 ............................................................................................................. 49 2.3 异步 TCP 应用编程 .......................................................................................................... 66 2.3.1 EventWaitHandle 类 ............................................................................................... 67 2.3.2 AsyncCallback 委托 ............................................................................................... 69 2.3.3 BeginAcceptTcpClient 方法和 EndAcceptTcpClient 方法 .................................... 70 2.3.4 BeginConnect 方法和 EndConnect 方法 ............................................................... 70 2.3.5 发送数据 ................................................................................................................. 71 2.3.6 接收数据 ................................................................................................................. 72 2.4 异步 TCP 聊天程序 .......................................................................................................... 73 2.4.1 服务器端设计 ......................................................................................................... 73 2.4.2 客户端设计 ............................................................................................................. 79 3
2.5 习题 2 ................................................................................................................................ 83 第 3 章 UDP 应用编程 .................................................................................................................... 84 3.1 UDP 协议基础知识 ........................................................................................................... 84 3.2 UDP 应用编程技术 ........................................................................................................... 84 3.2.1 UdpClient 类 ........................................................................................................... 84 3.2.2 发送和接收数据的方法 ......................................................................................... 86 3.3 利用 UDP 协议进行广播和组播 ...................................................................................... 90 3.3.1 通过 Internet 实现群发功能 .................................................................................. 90 3.3.2 在 Internet 上举行网络会议讨论 .......................................................................... 96 3.4 习题 3 ................................................................................................................................ 101 第 4 章 P2P 应用编程 ................................................................................................................... 102 4.1 P2P 基础知识 .................................................................................................................. 102 4.2 P2P 应用举例 .................................................................................................................. 104 4.3 习题 4 .............................................................................................................................. 114 第 5 章 SMTP 与 POP3 应用编程 ................................................................................................ 115 5.1 通过应用程序发送电子邮件 .......................................................................................... 115 5.1.1 SMTP 协议 ........................................................................................................... 115 5.1.2 发送邮件 ............................................................................................................... 116 5.2 利用同步 TCP 接收电子邮件 ........................................................................................ 120 5.2.1 POP3 工作原理 .................................................................................................... 121 5.2.2 邮件接收处理 ....................................................................................................... 123 5.3 习题 5 .............................................................................................................................. 127 第 6 章 网络数据加密与解密 ....................................................................................................... 128 6.1 对称加密.......................................................................................................................... 128 6.2 不对称加密...................................................................................................................... 133 6.3 通过网络传递加密数据 .................................................................................................. 137 6.4 Hash 算法与数字签名 .................................................................................................... 153 6.5 习题 6 .............................................................................................................................. 154 第 7 章 三维设计与多媒体编程 ................................................................................................... 154 7.1 简单的 3D 设计入门 ....................................................................................................... 155 7.2 DirectX 基础知识 ............................................................................................................ 161 7.2.1 左手坐标系与右手坐标系 ................................................................................... 161 7.2.2 设备....................................................................................................................... 161 7.2.3 顶点与顶点缓冲 ................................................................................................... 162 7.2.4 Mesh 对象 ............................................................................................................. 162 7.2.5 法线....................................................................................................................... 163 7.2.6 纹理与纹理映射 ................................................................................................... 163 7.2.7 世界矩阵、投影矩阵与视图矩阵 ....................................................................... 163 7.2.8 背面剔除 ............................................................................................................... 164 4
7.3 Primitive ........................................................................................................................... 165 7.4 Mesh................................................................................................................................. 172 7.5 灯光与材质...................................................................................................................... 177 7.6 音频与视频...................................................................................................................... 187 7.7 直接使用 SoundPlayer 类播放 WAV 音频文件 ............................................................. 192 7.8 习题 7 .............................................................................................................................. 194 第 8 章 上机实验指导 ................................................................................................................... 194 8.1 实验一 简单网络聊天系统 .......................................................................................... 195 8.2 实验二 网络呼叫应答提醒系统 .................................................................................. 196 8.3 实验三 文件数据加密与解密 ...................................................................................... 200 5
前 言 在 Internet 和计算机技术高速发展的时代,处处都有网络的影子。在网络无处不在的环境 下,任何一种开发和编程都不可避免的涉及到网络应用。网络办公、网络游戏、网络电视、电 子商务、网络资源搜索、邮件处理、千姿百彩的网站、杂志订阅、远程控制……,以及其它各 种网络相关的应用软件,都是网络应用编程的实际应用。早期的网络编程难度大、效率低,使 初学者望而生畏,而 C#(读作 C Sharp)和.NET(读作 dot net)平台大大地简化了这些技术, 使过去困难的网络应用编程变得非常轻松。 目前,很多高校计算机及相关专业都开设了网络应用编程方面的课程。在就业压力日益增 大以及学生对所学知识与社会实际需求紧密结合的迫切要求的情况下,本书涉及的内容和知识 面显得尤为重要。 Microsoft Visual Studio 2005(简称 VS2005)是微软公司最新推出的先进的可视化开发工 具。2005 年底,微软隆重发布了 VS2005 英文版,并于 2006 年发布了 VS2005 简体中文版。 本书以 VS2005 Professional 简体中文版为开发环境,以易学易用为重点,充分考虑了学以致用 和社会实际需求,用大量的实例,引导读者快速掌握用 C#进行各类网络应用程序的编程方法 和技巧。使学生学习本书内容后能立即编写出与企事业实际应用紧密结合的程序,避免说起来 似懂非懂,做起来寸步难行的尴尬局面。 C#是在 C、C++和 Java 基础上开发的在.NET 平台上运行的为适应 Internet、Intranet 和各 类网络应用而设计的编程语言,该语言综合了 C、C++和 Java 以及其他高级语言的优点,是一 种语法优雅、类型安全、完全面向对象的编程语言。由于 C#是专门为.NET 平台而设计的开发 语言,并于 2001 年由 ECMA(European Computer Manufactures Association,欧洲计算机制造 商协会)规定为高级语言开发标准(ECMA-334),2003 年被 ISO(International Standards Organization,国际标准化组织)规定为国际标准(ISO/IEC 23270),因此它比任何在.NET 平 台下提供的其他开发语言都有无可比拟的优越性。毫无疑问,随着.NET 技术的普及,C#必将 成为开发 Internet 和企业级应用程序的首选程序设计语言。 本书的所有程序均在 VS2005 Professional 简体中文版开发环境下调试通过。是一本非常实 用的学习 C#网络高级应用编程的教材。读者通过阅读、上机练习和调试运行,能快速理解用 C#进行各类高级应用编程的方法和技巧。另外,由于本书的内容是在《C#网络应用编程基础》 (马骏主编,人民邮电出版社)介绍的基础知识之上进一步介绍更为复杂的高级应用编程方法 和技巧,因此需要读者有一定的 C#语言编程基础。 本书由马骏编著。参与编写和代码调试等工作的还有陈明、王芳、杨韶华、张瑞青、郑珂 等。人民邮电出版社的邹文波编辑对本书编写给予了大力支持、指导和帮助,在此表示深深的 谢意。 由于编者水平有限,书中难免存在错误之处,敬请读者批评指正。 编 者 2006 年 6
第 1 章 进程、线程与网络协议 在 Windows 应用程序中,基于客户端和服务器的各种网络编程技术应用非常广泛,本书 将逐步介绍这类应用程序的编程方法。 在《C#网络应用编程基础》(马骏主编,人民邮电出版社)一书中,我们已经学习了 C# 面向对象编程的基础知识以及基本控件的用法。本书假定读者对相关基本内容比较熟悉,并在 此基础上,进一步学习更为复杂的基于 Windows 窗体的高级应用开发,而不再介绍 C#语法以 及控件的用法等基础内容。如果读者对 C#相关知识不太熟悉,请首先阅读《C#网络应用编程 基础》一书。 本章主要介绍进程、线程、IP 地址与端口、套接字以及网络流等基本知识,这部分内容 是学习本书后面章节的基础,希望读者能很好的理解和掌握。 1.1 进程和线程 进程是对一段静态指令序列(程序)的动态执行过程,是系统进行资源分配和调度的一个 基本单位。与进程相关的信息包括进程的用户标志、正在执行的已经编译好的程序、进程程序 和数据在存储器中的位置等等。同一个进程又可以划分为若干个独立的执行流,我们称之为线 程。线程是 CPU 调度和分配的基本单位。在 Windows 环境下,用户可以同时运行多个应用程 序,每个执行的应用程序就是一个进程。例如一台电脑上同时打开两个 QQ 时,每个运行的 QQ 就是一个进程;而用一个 QQ 和多个人聊天时,每个聊天窗口就是一个线程。 进程和线程概念的提出,对提高软件的并行性有着重要的意义。并行性的主要特点就是并 发处理。在一个单处理器系统中,可以通过分时处理来获得并发,这种情况下,系统为每个线 程分配一个 CPU 时间片,每个线程只有在分配的时间片内才拥有对 CPU 的控制权,其他时间 都在等待。即同一时间只有一个线程在运行。由于系统为每个线程划分的时间片很小(20 毫 秒左右),所以在用户看来,好像是多个线程在同时运行。 为什么要使用多线程呢?考虑这样一种情况:在 C/S 模式下,服务器需要不断监听来自 各个客户端的请求,这时,如果采用单线程机制的话,服务器将无法处理其他事情,因为这个 线程要不断的循环监听请求而无暇对其他请求做出响应。实际上,当要花费大量时间进行连续 的操作时,或者等待网络或其他 I/O 设备响应时,都可以使用多线程技术。 在 C#中,有两个专门用于处理进程和线程的类:Process 类和 Thread 类。 1.1.1 Process 类 Process 类位于 System.Diagnostics 命名空间下,用于完成进程的相关处理任务。可以在本 地计算机上启动和停止进程,也可以查询进程的相关信息。在自己的程序中运行其他的应用程 序,实际上就是对进程进行管理。如果希望在自己的进程中启动和停止其他进程,首先要创建 Process 类的实例,并设置对象的 StartInfo 属性,然后调用该对象的 Start 方法启动进程。 【例 1-1】启动、停止和观察进程。 (1) 新建一个名为 ProcessExample 的 Windows 应用程序,设计界面如图 1-1 所示。 7
(2) 展开工具箱中的【组件】选项卡,然后将 Process 组件拖放到设计窗体上。 (3) 在代码的开始部分添加命名空间引用: using System.Diagnostics; using System.Threading; (4) 分别在【启动记事本】、【停止记事本】和【观 察所有进程】三个按钮的 Click 事件中添加代码: sender, 图1-1 测试进程界面 buttonStart_Click(object void private EventArgs e) { process1.StartInfo.FileName = "notepad.exe"; //启动 Notepad.exe 进程. process1.Start(); } private void buttonStop_Click(object sender, EventArgs e) { //创建新的 Process 组件的数组,并将它们与指定的进程名称(Notepad)的所有进程资源相关联. Process[] myprocesses; myprocesses = Process.GetProcessesByName("Notepad"); foreach (Process instance in myprocesses) { //设置终止当前线程前等待 1000 毫秒 instance.WaitForExit(1000); instance.CloseMainWindow(); } } private void buttonView_Click(object sender, EventArgs e) { listBox1.Items.Clear(); //创建 Process 类型的数组,并将它们与系统内所有进程相关联 Process[] processes; processes = Process.GetProcesses(); foreach (Process p in processes) { //Idle 指显示 CPU 空闲率的进程名称 //由于访问 Idle 的 StartTime 会出现异常,所以将其排除在外 if (p.ProcessName != "Idle") { //将每个进程名和进程开始时间加入 listBox1 中 this.listBox1.Items.Add( string.Format("{0,-30}{1:h:m:s}", p.ProcessName, p.StartTime)); } } } (5) 按键编译并执行,单击几次【启动记事本】按钮,观察打开的每个进程,然后单 击【停止记事本】,观察依次停止进程的情况。 由于安装 Windows 操作系统后,notepad.exe 就已经安装到系统文件夹下,而且在任何一 个文件夹中均可以直接运行,所以在这个例子中,我们选择了调用 notepad.exe 作为演示的例 8
分享到:
收藏