C#网络编程(基本概念和操作).pdf
《C#网络编程(基本概念和操作).pdf》由会员分享,可在线阅读,更多相关《C#网络编程(基本概念和操作).pdf(70页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、C#网 络 编 程(基 本 概 念 和 操 作)Part.1引 言 C#网 络 编 程 系 列 文 章 计 划 简 单 地 讲 述 网 络 编 程 方 面 的 基 础 知 识,由 于 本 人 在 这 方 面 功 力 有 限,所 以 只 能 提 供 一 些 初 步 的 入 门 知 识,希 望 能 对 刚 开 始 学 习 的 朋 友 提 供 一 些 帮 助。如 果 想 要 更 加 深 入 的 内 容,可 以 参 考 相 关 书 籍。本 文 是 该 系 列 第 篇,主 要 讲 述 了 基 于 套 接 字(Socket)进 行 网 络 编 程 的 基 本 概 念,其 中 包 括 TCP协 议、套 接
2、字、聊 天 程 序 的 三 种 开 发 模 式,以 及 两 个 基 本 操 作:侦 听 端 口、连 接 远 程 服 务 端;第 二 篇 讲 述 了 一 个 简 单 的 范 例:从 客 户 端 传 输 字 符 串 到 服 务 端,服 务 端 接 收 并 打 印 字 符 串,将 字 符 串 改 为 大 写,然 后 再 将 字 符 串 回 发 到 客 户 端,客 户 端 最 后 打 印 传 回 的 字 符 串;第 三 篇 是 第 二 篇 的 一 个 强 化,讲 述 了 第 二 篇 中 没 有 解 决 的 一 个 问 题,并 使 用 了 异 步 传 输 的 方 式 来 完 成 和 第 二 篇 同 样
3、的 功 能:第 四 篇 则 演 示 了 如 何 在 客 户 端 与 服 务 端 之 间 收 发 文 件;第 五 篇 实 现 了 一 个 能 够 在 线 聊 天 并 进 行 文 件 传 输 的 聊 天 程 序,实 际 上 是 对 前 面 知 识 的 一 个 综 合 应 用。与 本 文 相 关 的 还 有 一 篇 文 章 是:C#,但 这 个 聊 天 程 序 不 及 本 系 列 中 的 聊 天 程 序 功 能 强 大,实 现 方 式 也 不 相 同.网 络 编 程 基 本 概 念 1.面 向 连 接 的 传 输 协 议:TCP对 于 TCP协 议 我 不 想 说 太 多 东 西,这 属 于 大 学
4、 课 程,又 涉 及 计 算 机 科 学,而 我 不 是“学 院 派”,对 于 这 部 分 内 容,我 觉 得 作 为 开 发 人 员,只 需 要 掌 握 与 程 序 相 关 的 概 念 就 可 以 了,不 需 要 做 太 艰 深 的 研 究。我 们 首 先 知 道 TCP是 面 向 连 接 的,它 的 意 思 是 说 两 个 远 程 主 机(或 者 叫 进 程,因 为 实 际 上 远 程 通 信 是 进 程 之 间 的 通 信,而 进 程 则 是 运 行 中 的 程 序),必 须 首 先 进 行 一 个 握 手 过 程,确 认 连 接 成 功,之 后 才 能 传 输 实 际 的 数 据。比
5、如 说 进 程 A想 将 字 符 串“I t s a fineday today”发 给 进 程 B,它 首 先 要 建 立 连 接。在 这 一 过 程 中,它 首 先 需 要 知 道 进 程 B的 位 置(主 机 地 址 和 端 口 号)。随 后 发 送 一 个 不 包 含 实 际 数 据 的 请 求 报 文,我 们 可 以 将 这 个 报文 称 之 为“hello。如 果 进 程 B 接 收 到 了 这 个“hell。”,就 向 进 程 A 回 复 一 个 hello”,进 程 A 随 后 才 发 送 实 际 的 数 据 Its a fine day today”。关 于 TCP第 二 个
6、 需 要 了 解 的,就 是 它 是 全 双 工 的。意 思 是 说 如 果 两 个 主 机 上 的 进 程(比 如 进 程 A、进 程 B),一 旦 建 立 好 连 接,那 么 数 据 就 既 可 以 由 A 流 向 B,也 可 以 由 B 流 向 A。除 此 以 外,它 还 是 点 对 点 的,意 思 是 说 一 个 TCP连 接 总 是 两 者 之 间 的,在 发 送 中,通 过 一 个 连 接 将 数 据 发 给 多 个 接 收 方 是 不 可 能 的。TCP还 有 一 个 特 性,就 是 称 为 可 靠 的 数 据 传 输,意 思 是 连 接 建 立 后,数 据 的 发 送 一 定
7、能 够 到 达,并 且 是 有 序 的,就 是 说 发 的 时 候 你 发 了 ABC,那 么 收 的 一 方 收 到 的 也 一 定 是 ABC,而 不 会 是 BCA或 者 别 的 什 么。编 程 中 与 TCP相 关 的 最 重 要 的 一 个 概 念 就 是 套 接 字。我 们 应 该 知 道 网 络 七 层 协 议,如 果 我 们 将 上 面 的 应 用 程、表 示 层、会 话 层 笼 统 地 算 作 一 层(有 的 教 材 便 是 如 此 划 分 的),那 么 我 们 编 写 的 网 络 应 用 程 序 就 位 于 应 用 层,而 大 家 知 道 TCP是 属 于 传 输 层 的
8、协 议,那 么 我 们 在 应 用 层 如 何 使 用 传 输 层 的 服 务 呢(消 息 发 送 或 者 文 件 上 传 下 载)?大 家 知 道 在 应 用 程 序 中 我 们 用 接 口 来 分 离 实 现,在 应 用 层 和 传 输 层 之 间,则 是 使 用 套 接 字 来 进 行 分 离。它 就 像 是 传 输 层 为 应 用 层 开 的 一 个 小 口,应 用 程 序 通 过 这 个 小 U 向 远 程 发 送 数 据,或 者 接 收 远 程 发 来 的 数 据;而 这 个 小 口 以 内,也 就 是 数 据 进 入 这 个 口 之 后,或 者 数 据 从 这 个 口 出 来 之
9、 前,我 们 是 不 知 道 也 不 需 要 知 道 的,我 们 也 不 会 关 心 它 如 何 传 输,这 属 于 网 络 其 它 层 次 的 工 作。举 个 例 子,如 果 你 想 写 封 邮 件 发 给 远 方 的 朋 友,那 么 你 如 何 写 信、将 信 打 包,属 于 应 用 层,信 怎 么 写,怎 么 打 包 完 全 由 我 们 做 主;而 当 我 们 将 信 投 入 邮 筒 时,邮 筒 的 那 个 口 就 是 套 接 字,在 进 入 套 接 字 之 后,就 是 传 输 层、网 络 层 等(邮 局、公 路 交 管 或 者 航 线 等)其 它 层 次 的 工 作 了。我 们 从 来
10、 不 会 去 关 心 信 是 如 何 从 西 安 发 往 北 京 的,我 们 只 知 道 写 好 了 投 入 邮 筒 就 0K 了。可 以 用 下 面 这 两 幅 图 来 表 示 它:注 意 在 上 面 图 中,两 个 主 机 是 对 等 的,但 是 按 照 约 定,我 们 将 发 起 请 求 的 一 方 称 为 客 户 端,将 另 一 端 称 为 服 务 端。可 以 看 出 两 个 程 序 之 间 的 对 话 是 通 过 套 接 字 这 个 出 入 口 来 完 成 的,实 际 上 套 接 字 包 含 的 最 重 要 的 也 就 是 两 个 信 息:连 接 至 远 程 的 本 地 的 端 口
11、信 息(本 机 地 址 和 端 口 号),连 接 到 的 远 程 的 端 口 信 息(远 程 地 址 和 端 口 号)。注 意 上 面 词 语 的 微 妙 变 化,一 个 是 本 地 地 址,一 个 是 远 程 地 址。这 里 又 出 现 了 了 一 个 名 词 端 口。一 般 来 说 我 们 的 计 算 机 上 运 行 着 非 常 多 的 应 用 程 序,它 们 可 能 都 需 要 同 远 程 主 机 打 交 道,所 以 远 程 主 机 就 需 要 有 一 个 ID来 标 识 它 想 与 本 地 机 器 上 的 哪 个 应 用 程 序 打 交 道,这 里 的 ID就 是 端 口。将 端 口
12、分 配 给 一 个 应 用 程 序,那 么 来 自 这 个 端 口 的 数 据 则 总 是 针 对 这 个 应 用 程 序 的。有 这 样 个 很 好 的 例 子:可 以 将 主 机 地 址 想 象 为 电 话 号 码,而 将 端 口 号 想 象 为 分 机 号。在.NET中,尽 管 我 们 可 以 直 接 对 套 接 字 编 程,但 是.NET提 供 了 两 个 类 将 对 套 接 字 的 编 程 进 行 了 一 个 封 装,使 我 们 的 使 用 能 够 更 加 方 便,这 两 个 类 是 TcpClient和 TcpListener,它 与 套 接 字 的 关 系 如 下:去 往 传 输
13、 以 来 白 传 输 以 从 上 面 图 中 可 以 看 出 TcpClient和 TcpListener对 套 接 字 进 行 了 封 装。从 中 也 可 以 看 出,TcpListener用 于 接 受 连 接 请 求,而 TcpClient则 用 于 接 收 和 发 送 流 数 据。这 幅 图 的 意 思 是 TcpListener持 续 地 保 持 对 端 口 的 侦 听,一 旦 收 到 一 个 连 接 请 求 后,就 可 以 获 得 一个 TcpClienl对 象,而 对 于 数 据 的 发 送 和 接 收 都 有 TcpClient去 完 成。此 时,TcpListener并 没
14、有 停 止 工 作,它 始 终 持 续 地 保 持 对 端 口 的 侦 听 状 态。我 们 考 虑 这 样-种 情 况:两 台 主 机,主 机 A 和 主 机 B,起 初 它 们 谁 也 不 知 道 谁 在 哪 儿,当 它 们 想 要 进 行 对 话 时,总 是 需 要 有 一 方 发 起 连 接,而 另 一 方 则 需 要 对 本 机 的 某 一 端 口 进 行 侦 听。而 在 侦 听 方 收 到 连 接 请 求、并 建 立 起 连 接 以 后,它 们 之 间 进 行 收 发 数 据 时,发 起 连 接 的 一 方 并 不 需 要 再 进 行 侦 听。因 为 连 接 是 全 双 工 的,它
15、可 以 使 用 现 有 的 连 接 进 行 收 发 数 据。而 我 们 前 面 已 经 做 了 定 义:将 发 起 连 接 的 一 方 称 为 客 户 端,另 一 段 称 为 服 务 端,则 现 在 可 以 得 出:总 是 服 务 端 在 使 用 TcpListener类,因 为 它 需 要 建 立 起 一 个 初 始 的 连 接。2.网 络 聊 天 程 序 的 三 种 模 式 实 现 一 个 网 络 聊 天 程 序 本 应 是 最 后 一 篇 文 章 的 内 容,也 是 本 系 列 最 后 的 一 个 程 序,来 作 为 一 个 终 结。但 是 我 想 后 面 更 多 的 是 编 码,讲 述
16、 的 内 容 应 该 不 会 太 多,所 以 还 是 把 讲 述 的 东 西 都 放 到 这 里 吧。当 采 用 这 种 模 式 时,即 是 所 谓 的 完 全 点 对 点 模 式,此 时 每 台 计 算 机 本 身 也 是 服 务 器,因 为 它 需 要 进 行 端 口 的 侦 听。实 现 这 个 模 式 的 难 点 是:各 个 主 机(或 终 端)之 间 如 何 知 道 其 它 主 机 的 存 在?此 时 通 常 的 做 法 是 当 某 一 主 机 上 线 时,使 用 UDP协 议 进 行 一 个 广 播(Broadcast),通 过 这 种 方 式 来“告 知”其 它 主 机 自 己 已
17、 经 在 线 并 说 明 位 置,收 到 广 播 的 主 机 发 回 一 个 应 答,此 时 主 机 便 知 道 其 他 主 机 的 存 在。这 种 方 式 我 个 人 并 不 喜 欢,但 在 G*:一 这 篇 文 章 中,我 使 用 了 这 种 模 式,可 惜 的 是 我 没 有 实 现 广 播,所 以 还 很 不 完 善。网 络 聊 天 实 现 模 式 2第 二 种 方 式 较 好 的 解 决 了 上 面 的 问 题,它 引 入 了 服 务 器,由 这 个 服 务 器 来 专 门 进 行 广 播。服 务 器 持 续 保 持 对 端 口 的 侦 听 状 态,每 当 有 主 机 上 线 时,首
18、 先 连 接 至 服 务 器,服 务 器 收 到 连 接 后,将 该 主 机 的 位 置(地 址 和 端 口 号)发 往 其 他 在 线 主 机(绿 色 箭 头 标 识)。这 样 其 他 主 机 便 知 道 该 主 机 已 上 线,并 知 道 其 所 在 位 置,从 而 可 以 进 行 连 接 和 对 话。在 服 务 器 进 行 了 广 播 之 后,因 为 各 个 主 机 已 经 知 道 了 其 他 主 机 的 位 置,因 此 主 机 之 间 的 对 话 就 不 再 通 过 服 务 器(黑 色 箭 头 表 示),而 是 直 接 进 行 连 接。因 此,使 用 这 种 模 式 时;各 个 主 机
19、 依 然 需 要 保 持 对 端 口 的 侦 听。在 某 台 主 机 离 线 时,与 登 录 时 的 模 式 类 似,服 务 器 会 收 到 通 知,然 后 转 告 给 其 他 的 主 机。第 三 种 模 式 是 我 觉 得 最 简 单 也 最 实 用 的 种,主 机 的 登 录 与 离 线 与 第 二 种 模 式 相 同。注 意 到 每 台 主 机 在 上 线 时 首 先 就 与 服 务 器 建 立 了 连 接,那 么 从 主 机 A 发 往 主 机 B 发 送 消 息,就 可 以 通 过 这 样 一 条 路 径,主 机 A-服 务 器 一 主 机 B,通 过 这 种 方 式,各 个 主 机
20、 不 需 要 在 对 端 口 进 行 侦 听,而 只 需 要 服 务 器 进 行 侦 听 就 可 以 了,大 大 地 简 化 了 开 发。而 对 于 一 些 较 大 的 文 件,比 如 说 图 片 或 者 文 件,如 果 想 由 主 机 A 发 往 主 机 B,如 果 通 过 服 务 器 进 行 传 输 效 率 会 比 较 低,此 时 可 以 临 时 搭 建 一 个 主 机 A 至 主 机 B之 间 的 连 接,用 于 传 输 大 文 件。当 文 件 传 输 结 束 之 后 再 关 闭 连 接(桔 红 色 箭 头 标 识)。除 此 以 外,由 于 消 息 都 经 过 服 务 器,所 以 服 务
21、 器 还 可 以 缓 存 主 机 间 的 对 话,即 是 说 当 主 机 A发 往 主 机 B 时,如 果 主 机 B 已 经 离 线,则 服 务 器 可 以 对 消 息 进 行 缓 存,当 主 机 B下 次 连 接 到 服 务 器 时,服 务 器 自 动 将 缓 存 的 消 息 发 给 主 机 B。本 系 列 文 章 最 后 采 用 的 即 是 此 种 模 式,不 过 没 有 实 现 过 多 复 杂 的 功 能。接 下 来 我 们 的 理 论 知 识 告 一 段 落,开 始 下 一 阶 段 一 一 漫 长 的 编 码。基 本 操 作 1.服 务 端 对 端 口 进 行 侦 听 接 下 来 我
22、 们 开 始 编 写 一 些 实 际 的 代 码,第 一 步 就 是 开 启 对 本 地 机 器 上 某 一 端 口 的 侦 听。首 先 创 建 一 个 控 制 台 应 用 程 序,将 项 目 名 称 命 名 为 ServerConsole,它 代 表 我 们 的 服 务 端。如 果 想 要 与 外 界 进 行 通 信,第 一 件 要 做 的 事 情 就 是 开 启 对 端 口 的 侦 听,这 就 像 为 计 算 机 打 开 了 个“门”,所 有 向 这 个“门”发 送 的 请 求(“敲 门”)都 会 被 系 统 接 收 到。在 C#中 可 以 通 过 下 面 几 个 步 骤 完 成,首 先
23、使 用 本 机 Ip地 址 和 端 口 号 创 建 一 个 System.Net.Sockets.TcpListener类 型 的 实 例,然 后 在 该 实 例 上 调 用 Start。方 法,从 而 开 启 对 指 定 端 口 的 侦 听。using System.Net;/引 入 这 两 个 命 名 空 间,以 下 同 using System.Net.Sockets;using./略 class Server static void Main(string args)Console.WriteLine(MServer is running.n);IPAddress ip=new IPA
24、ddress(new byte 127,0,0,1);TcpListener listener=new TcpListener(ipz 8500);listener.Start();/开 始 侦 听 Console.WriteLine(HStart ListeningConsole.WriteLine(nnn 输 入 Q 键 退 出。H;ConsoleKey key;do(key=Console.ReadKey(true).Key;while(key!=ConsoleKey.Q);/获 得 IPAddress对 象 的 另 外 几 种 常 用 方 法:IPAddress ip=IPAddres
25、s.Parse(,127.0.0.1,);IPAddress ip=Dns.GetHostEntry(nlocalhostn).AddressList0;上 面 的 代 码 中,我 们 开 启 了 对 8500端 口 的 侦 听。在 运 行 了 上 面 的 程 序 之 后,然 后 打 开“命 令 提 示 符,输 入“netstat-a”,可 以 看 到 计 算 机 器 中 所 有 打 开 的 端 口 的 状 态。可 以 从 中 找 到 8500端 口,看 到 它 的 状 态 是 LISTENING,这 说 明 它 已 经 开 始 了 侦 听:TCP j irniny:1030 0.0.0.0:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C# 网络 编程 基本概念 操作
限制150内