




已阅读5页,还剩5页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
高级高级 Internet Internet 实验报告实验报告 题目题目 SocketSocket 网络编程网络编程 学学生生姓姓名名 班班 级级 软件软件 12021202 班班 学学 号号 指指导导老老师师 王文浪王文浪 成成 绩绩 西安邮电大学计算机学院西安邮电大学计算机学院 20152015 年年 4 4 月月 2727 日日 一 一 实验目的实验目的 熟悉 Socket 网络编程 熟悉 CS 客户机模式 熟悉 ServerSocket 编写服务端 熟悉使用多线程机制处理业务 了解客户机之间通信方式 二 二 实验内容及要求实验内容及要求 采用 CS 模式 通过客户机向服务器端发送消息 采用 Socket 来实现客户机之间的网络通信 通过 ServerSocket 创建服务端来处理接受客户机请求 通过多线程方式来处理客户机之间的通信请求 实现通信的界面窗口 实验内容有发送私聊消息 向选中用户发送文件 用户接受文件 三 三 实验过程实验过程 1 首先学习了在 JAVA 语言中 TCP IP 协议下的 Socket 网络模式图如 1 1 所 示 图 1 1TCP IP 协议下的 Socket 网络模式图 由图 1 1 可以得到 Socket 通信的步骤如下 1 在服务器端创建一个 ServerSocket 对象并且指定端口号 2 运行 ServerSocket 的 accept 方法 等候客户端的请求 3 客户端创建一个 Socket 对象 指定计算机的地址和端口号 向服务器端 发出连接请求 4 服务器端接收到来自客户端的请求后 创建 Socket 对象与客户端建立连 接 5 服务器端和客户端分别建立输入输出流进行数据传输 6 通信结束后 服务器端和客户端分别关闭相应的 Socket 连接 7 服务器端程序运行结束后 调用 ServerSocket 对象的 close 方法停止等待 客户端请求 由此可以看出 对于一个网络通信程序来说 需要编写服务器端和客户端 两个程序才能够实现相互通信 为了实现一个服务端程序能够对多个客户进行 服务 需要使用到多线程 在服务器端创建客户请求的监听线程 一旦客户发 起请求连接 在服务器端创建用于服务的 Socket 利用改 Socket 完成与客户的 通信 即每个线程针对一个客户进行服务 数据传输结束后 终止运行该 Socket 通信的线程 继续在服务器端指定的端口进行监听 2 数据报的通信的发送和接收过程 数据报的通信的发送和接收过程 应用程序的工作流程如下 1 首先要建立数据报通信的 Socket 我们可以通过创建一个 DatagramSocket 对象实现它 在 Java 中 DatagramSocket 类有如下两种构造方 法 public DatagramSocket 构造一个数据报 socket 并使其与本地主机任 一可用的端口连接 若打不开 socket 则抛出 SocketException 异常 public DatagramSocket int port 构造一个数据报 socket 并使其与本 地主机指定的端口连接 若打不开 socket 或 socket 无法与指定的端口连接则 抛出 SocketException 异常 2 创建一个数据报文包 用来实现无连接的包传送服务 每个数据报文 包用 DatagramPacket 类创建 DatagramPacket 对象封装了数据报包数据 包 长度 目标地址和目标端口 客户端要发送数据报文包 要调用 DatagramPacket 类以如下形式的构造函数创建 DatagramPacket 对象 将要发 送的数据和包文目的地址信息放入对象之中 DatagramPacket byte bufferedarray int length InetAddress address int port 即构造一个包 长度为 length 的包传送到指定主机指定端口号上的数据报文包 参数 length 必须小于等于 bufferedarry length DatagramPacket 类提供了 4 个类获取信息 public byte getData 返回一个字节数组 包含收到或要发送的数据 报中的数据 public int getLength 返回发送或接收到的数据的长度 public InetAddress getAddress 返回一个发送或接收此数据报包文的 机器的 IP 地址 public int getPort 返回发送或接收数据报的远程主机的端口号 3 创建完 DatagramSocket 和 DatagramPacket 对象 就可以发送数据报 文包了 发送是通过调用 DatagramSocket 对象的 send 方法实现 它需要以 DatagramPacket 对象为参数 将刚才封装进 DatagramPacket 对象中的数据组 成数据报发出 4 当然 我们也可以接收数据报文包 为了接收从服务器返回的结果数 据报文包 我们需要创建一个新的 DatagramPacket 对象 这就需要用到 DatagramPacket 的另一种构造方式 DatagramPacket byte bufferedarray int length 即只需指明存放接收的数据报的缓冲区和长度 调用 DatagramSocket 对象的 receive 方法完成接收数据报的工作 此时需要将上 面创建的 DatagramPacket 对象作为参数 该方法会一直阻塞直到收到一个数据 报文包 此时 DatagramPacket 的缓冲区中包含的就是接收到的数据 数据报文 包中也包含发送者的 IP 地址 发送者机器上的端口号等信息 5 处理接收缓冲区内的数据 获取服务结果 6 当通信完成后 可以使用 DatagramSocket 对象的 close 方法关闭 数据报通信 Socket 当然 Java 会自动关闭 Socket 释放 DatagramSocket 和 DatagramPacket 所占用的资源 但是作为一种良好的编程习惯 还是要显式地 予以关闭 3 DatagramSocket 类详解类详解 Java 使用 DatagramSocket 代表 UDP 协议的 Socket DatagramSocket 本身只是码头 不能产生 IO 流 它的唯一作用就是接收和发送数据报 Java 使用 DatagramPacket 来代 表数据报 DatagramSocket 接收和发送的数据都是通过 DatagramPacket 对象完成的 DatagramSocket 创建一个 DatagramSocket 实例 并将该对象绑定到本机默认 IP 地址 本机所有可用端口中随机选择的某个端口 DatagramSocket int prot 创建一个 DatagramSocket 实例 并将该对象绑定到本机默认 IP 地址 指定端口 DatagramSocket int port InetAddress laddr 创建一个 DatagramSocket 实例 并将该对 象绑定到指定 IP 地址 指定端口 通过上面三个构造器中的任意一个构造器即可创建一个 DatagramSocket 实例 通常在创 建服务器时 创建指定端口的 DatagramSocket 实例 这样保证其他客户端可以将数据发 送到该服务器 一旦得到了 DatagramSocket 实例之后 就可以通过如下两个方法来接收 和发送数据 receive DatagramPacket p 从该 DatagramSocket 中接收数据报 send DatagramPacket p 以该 DatagramSocket 对象向外发送数据报 从上面两个方法可以看出 使用 DatagramSocket 发送数据报时 DatagramSocket 并不 知道将该数据报发送到哪里 而是由 DatagramPacket 自身决定数据报的目的地 就像码 头并不知道每个集装箱的目的地 码头只是将这些集装箱发送出去 而集装箱本身包含了 该集装箱的目的地 DatagramPacket 的构造器 DatagramPacket byte buf int length 以一个空数组来创建 DatagramPacket 对象 该对 象的作用是接收 DatagramSocket 中的数据 DatagramPacket byte buf int length InetAddress addr int port 以一个包含数据的数 组来创建 DatagramPacket 对象 创建该 DatagramPacket 对象时还指定了 IP 地址和端口 这就决定了该数据报的目的地 DatagramPacket byte buf int offset int length 以一个空数组来创建 DatagramPacket 对象 并指定接收到的数据放入 buf 数组中时从 offset 开始 最多放 length 个字节 DatagramPacket byte buf int offset int length InetAddress address int port 创建一个 用于发送的 DatagramPacket 对象 指定发送 buf 数组中从 offset 开始 总共 length 个字 节 当 Client Server 程序使用 UDP 协议时 实际上并没有明显的服务器端和客户端 因为两 方都需要先建立一个 DatagramSocket 对象 用来接收或发送数据报 然后使用 DatagramPacket 对象作为传输数据的载体 通常固定 IP 地址 固定端口的 DatagramSocket 对象所在的程序被称为服务器 因为该 DatagramSocket 可以主动接收 客户端数据 在接收数据之前 应该采用上面的第一个或第三个构造器生成一个 DatagramPacket 对象 给出接收数据的字节数组及其长度 然后调用 DatagramSocket 的 receive 方法等待数据 报的到来 receive 将一直等待 该方法会阻塞调用该方法的线程 直到收到一个数据 报为止 如下代码所示 1 创建一个接收数据的 DatagramPacket 对象 2 DatagramPacket packet new DatagramPacket buf 256 3 接收数据报 4 socket receive packet 在发送数据之前 调用第二个或第四个构造器创建 DatagramPacket 对象 此时的字节数 组里存放了想发送的数据 除此之外 还要给出完整的目的地址 包括 IP 地址和端口号 发送数据是通过 DatagramSocket 的 send 方法实现的 send 方法根据数据报的目的地 址来寻径以传送数据报 如下代码所示 1 创建一个发送数据的 DatagramPacket 对象 2 DatagramPacket packet new DatagramPacket buf length address port 3 发送数据报 4 socket send packet 使用 DatagramPacket 接收数据时 会感觉 DatagramPacket 设计得过于烦琐 开发者只 关心该 DatagramPacket 能放多少数据 而 DatagramPacket 是否采用字节数组来存储数 据完全不想关心 但 Java 要求创建接收数据用的 DatagramPacket 时 必须传入一个空 的字节数组 该数组的长度决定了该 DatagramPacket 能放多少数据 这实际上暴露了 DatagramPacket 的实现细节 接着 DatagramPacket 又提供了一个 getData 方法 该方 法又可以返回 Datagram Packet 对象里封装的字节数组 该方法更显得有些多余 如果程 序需要获取 DatagramPacket 里封装的字节数组 直接访问传给 DatagramPacket 构造器 的字节数组实参即可 无须调用该方法 当服务器端 也可以是客户端 接收到一个 DatagramPacket 对象后 如果想向该数据报 的发送者 反馈 一些信息 但由于 UDP 协议是面向非连接的 所以接收者并不知道每个数 据报由谁发送过来 但程序可以调用 DatagramPacket 的如下 3 个方法来获取发送者的 IP 地址和端口 InetAddress getAddress 当程序准备发送此数据报时 该方法返回此数据报的目标机器 的 IP 地址 当程序刚接收到一个数据报时 该方法返回该数据报的发送主机的 IP 地址 int getPort 当程序准备发送此数据报时 该方法返回此数据报的目标机器的端口 当程 序刚接收到一个数据报时 该方法返回该数据报的发送主机的端口 SocketAddress getSocketAddress 当程序准备发送此数据报时 该方法返回此数据报 的目标 SocketAddress 当程序刚接收到一个数据报时 该方法返回该数据报的发送主机 的 SocketAddress getSocketAddress 方法的返回值是一个 SocketAddress 对象 该对象实际上就是一个 IP 地址和一个端口号 也就是说 SocketAddress 对象封装了一个 InetAddress 对象和一个 代表端口的整数 所以使用
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 46122.2-2025烟花爆竹特定化学物质检测方法第2部分:六氯代苯含量的测定气相色谱法
- 2025咨询工程师自我提分评估含答案详解【A卷】
- 应急安全培训致辞稿件课件
- 打包站转让合同(标准版)
- 农村折屋合同(标准版)
- 国外的进口合同(标准版)
- 2024-2025学年度制冷与空调作业能力检测试卷及完整答案详解(典优)
- 2025自考专业(金融)全真模拟模拟题重点附答案详解
- 中班美术教案《漂亮的大鱼》反思
- 2025年智慧生态公园规划初步设计评估与实施策略报告
- 公路养护技术管理与实施细则
- 2025-2030留学培训行业市场运行态势及发展前景预测与商业合作机会研究报告
- 房地产开发公司工程部经理个人工作总结
- 2025年交通工程师资格考试试题及答案解析
- 2025年私人住宅装修合同及详细工程清单
- 2025年法本法硕真题及答案
- 变压器装配工职业技能考核试卷及答案
- 驻场人员管理协议书8篇
- 秋季传染病健康知识培训课件
- 2025一级建造师考试《港口与航道工程》真题及答案
- 2024年一级建造师《建筑工程管理与实务》真题及答案
评论
0/150
提交评论