目 录
前 言
第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 实验三运行界面