




已阅读5页,还剩35页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于TCP协议的Socket通信 1 2 本章内容 1 Socket的基本概念及通信过程2 服务器端Socket程序的编写ServerSocket的构造方法及主要方法利用telnet验证服务器程序的正确性ServerSocket一些重要选项的设置3 客户端Socket程序的编写Socket的构造方法和主要方法服务器与客户端的一对一通信服务器与客户端的一对多通信在服务器端采用线程池Socket一些重要选项的设置在服务器与客户端之间传递对象ObjectOutputStreamObjectInputStream传递文件4 一些注意事项 3 套接字 Socket Socket是网络驱动层提供给应用程序编程的接口和一种数据发送 接收机制 Socket由应用程序创建 与网络驱动层建立绑定机制 告诉网络驱动层当前应用程序所对应的IP地址和端口号 码头A 码头B 货物 货物 货物具体如何运送交给货运公司 4 Socket数据发送过程 应用程序 Socket 网络驱动层 创建Socket 通过bind将Socket信息通知给网络驱动层 将要发送的数据写入到socket中 网络驱动层从Socket中取出数据通过网卡发送出去 5 Socket数据接收过程 应用程序 Socket 网络驱动层 创建Socket 通过bind将Socket信息通知给网络驱动层 从socket中将数据读出 网络驱动层将网络中与Socket对应的数据接收并放入到Socket中 6 与Socket相关的类 相关类在包中ServerSocket类位于服务器端的TCP通信Socket类位于服务器端和客户端的TCP通信DatagramSocket类支持UDP通信协议 7 TCP网络程序通信模型 服务器端ServerSocket 客户端Socket1 客户端Socket2 向服务器发送请求 为客户端1创建Socket 为客户端2创建Socket 专项连接进行通信 专项连接进行通信 为客户端请求创建Socket 为客户端请求创建Socket 8 publicServerSocket intport 创建绑定到特定端口的服务器套接字 如果port为0 由操作系统分配一个端口 匿名端口 publicServerSocket intport intbacklog 创建服务器套接字并将其绑定到指定的本地端口号 backlog表示服务器忙时所指定的最大等待连接数 publicServerSocket intport intbacklog InetAddressbindAddr bindAddr表示套接字所绑定的计算机IP地址 此构造方法适合一台计算机有多个网卡的情况 注意 这些构造方法都将抛出例外IOException ServerSocket 9 publicServerSocket 此方法创建的Socket不与任何本地端口绑定 需要通过调用bind 方法与特定端口绑定 无参构造方法的主要用途是 允许服务器在绑定到特定端口之前 先设置ServerSocket的选项 因为一旦服务器与端口绑定 就不能设置ServerSocket的选项了 ServerSocketserverSocket newServerSocket serverSocket setReuseAddress true serverSocket bind newInetSocketAddress 9000 ServerSocket 10 ServerSocket的主要方法 Socketaccept throwsSocketException监听并接受客户端到此套接字的连接请求 并为客户端的请求创建一个与之对应的Socket对象 voidclose throwsSocketException释放ServerSocket占用的端口 断开与所有客户端的连接 InetAddressgetInetAddress throwsSocketException返回此服务器套接字的本地地址intgetLocalPort throwsSocketException返回此套接字的监听端口booleanisClosed 只有执行了close 此方法才返回true booleanisBound 判断服务器是否曾经与端口成功绑定过 11 用telnet验证TCP协议的服务器端程序 Telnet协议是TCP IP协议族中的一员 是Internet远程登陆服务的标准协议和主要方式 它为用户提供了在本地计算机上完成远程主机工作的能力 telnet程序位于本机C Windwos System32目录中 远程登录的命令格式 telnetIP地址端口号见源文件 tcp ServerSocketTest java 用telnet验证TCP协议的服务器端程序 在本地计算机上使用telnet功能 首先按下图方式将telnet功能打开 12 13 设置ServerSocket的选项 1 SO TIMEOUTvoidsetSoTimeout inttimeout throwsSocketExceptionintgetSoTimeout throwsIOException用于设置服务器等待客户连接的超时时间 默认为0 一直等待下去 如果超过了超时时间 服务器端抛出SocketTimeoutException 见源文件 ServerSocket选项设置 TimeOutTest java 14 设置ServerSocket的选项 2 SO REUSEADDRvoidsetReuseAddress booleanon throwsSocketExceptionbooleangetReuseAddress throwsIOException如果ServerSocket关闭后 仍然有发向它的数据 操作系统并不会立刻关闭它所绑定的端口 等接收完数据后 再关闭端口 如果此时立刻在同一个主机上重启服务器程序 由于端口被占用 服务器启动失败抛出BindException 为了确保一个进程关闭了ServerSocket后 即使操作系统没有释放端口 同一主机上的其他进程还能重用该端口 调用setResueAddress true 方法 注意 此方法在绑定到特定端口前调用 15 设置ServerSocket的选项 3 SO RCVBUFvoidsetReceiveBufferSize intsize throwsSocketExceptionintgetReceiveBufferSize throwsIOException表示服务器端用于接收数据的缓冲区的大小 以字节为单位 SO RCVBUF默认值与操作系统有关 如果要设置大于64K的缓冲区 必须在ServerSocket绑定到特定端口之前有效 执行setReceiveBufferSize 方法相当于对所有accept 方法返回的Socket设置接收数据的缓冲区的大小 16 publicSocket Stringhost intport 创建套接字并将其连接到指定主机上的指定端口号 publicSocket InetAddressaddress intport 创建套接字并将其连接到指定IP地址的指定端口号 publicSocket Stringhost intport InetAddresslocalAddr intlocalPort 创建套接字并将其连接到指定主机上的指定端口号 localAddr和localPort表示当前客户端的IP和端口 此方法适合客户端有多个网卡的情况 publicSocket InetAddressaddress intport InetAddresslocalAddr intlocalPort 创建套接字并将其连接到指定IP地址的指定端口号 localAddr和localPort表示当前客户端的IP和端口 此方法适合客户端有多个网卡的情况 Socket 17 Socket连接服务器端时可能抛出的异常 1 UnknownHostException 如果无法识别服务器所在主机的名称或IP地址 就会抛出此异常 2 ConnectException 如果没有服务器进程所指定监听的端口 或者服务器进程拒绝连接 就会抛出此异常 3 SocketTimeoutException 如果等待连接超时 就会抛出此异常 4 BindException 如果无法把Socket对象与指定的本地IP地址或端口绑定 就会抛出此种异常 18 与远程服务器相关 InetAddressgetInetAddress 返回远程服务器的IP地址intgetPort 返回远程服务器的端口与本地客户端相关 InetAddressgetLocalAddress 返回本地客户端的IP地址intgetLocalPort 返回本地客户端的端口 Socket的主要方法 Socket的主要方法 InputStreamgetInputStream OutputStreamgetOutputStream voidclose 注意 以上三个方法会抛出IOException三个状态测试方法booleanisClosed 已经连接到远程主机 还没有关闭 返回falsebooleanisConnected 曾经成功连接到远程主机 返回truebooleanisBound 如果将套接字成功地绑定到一个地址 则返回true 19 Socket的主要方法 voidshutdownInput throwsIOException关闭输入流 发送到套接字的输入流端的任何数据都将被确认然后被静默丢弃 此时再从套接字输入流读取内容将返回EOF voidshutdownOutput throwsIOException关闭输出流 对于TCP套接字 任何以前写入的数据都将被发送 并且后跟TCP的正常连接终止序列 此时在向套接字的输出流写入数据 则该流将抛出IOException booleanisInputShutdown booleanisOutputShutdown 20 21 TCP协议Socket通信过程 创建ServerSocket对象 accept 方法监听客户端连接 连接建立成功 得到Socket对象 通过Socket对象创建输入字节流 通过Socket对象创建输出字节流 创建Socket对象 指定要连接的主机IP和端口号 通过Socket对象创建输出字节流 通过Socket对象创建输出字节流 关闭流和套接字 关闭流和套接字 Socket建立成功 服务器端 客户端 21 设置Socket的选项 1 TCP NODELAYvoidsetTcpNoDelay booleanon throwsSocketExceptionbooleangetTcpNoDelay throwsSocketException默认情况下 发送数据采用Negale算法 发送数据先进入缓冲区中 等缓冲区满了后再发出 并且要等到接收方的回应后 继续发送下一批数据 适合发送大容量数据的情况 22 设置Socket的选项 2 SO REUSEADDRvoidsetReuseAddress booleanon throwsSocketExceptionbooleangetReuseAddress throwsSocketException为了确保一个进程关闭Socket后 即使它还没释放端口 同一个主机上的其他进程还可以立刻重用该端口 setReuseAddress true 方法必须在Socket还没有绑定到一个本地端口之前调用 否则无效 Sockets newSocket s setReuseAddress true s connect newInetSocketAddress hostname 8800 23 设置Socket的选项 3 SO TIMEOUT从Socket的输入流读取数据时 如果还没有数据 就会等待待 bytebuffer newbyte 1024 InputStreamin socket getInputStream in read buffer 直到满足以下情况 结束等待 1 输入流中有1024个字节 放入buffer中 返回读到的字节个数 2 已经快接近输入流的末尾 距离末尾还有小于1024个字节 将这些字节读入到buffer 返回读取的字节数 24 设置Socket的选项 3 已经读到输入流的末尾 返回 1 4 连接已经断开 抛出IOException 5 如果设定了等待超时时间 超过时间后抛出SocketTimeoutException voidsetSoTimeout intmilliseconds throwsSocketExceptionintgetSoTimeout throwsSocketException注意 超时时间必须在创建流之前设定才有效 见源文件 Socket选项设置 TimeoutServer javaTimeoutClient java 25 设置Socket的选项 4 SO LINGERvoidsetSoLinger booleanon intseconds throwsSocketException 以秒为单位 intgetSoLinger throwsSocketException默认情况下 执行Socket的close 方法 该方法会立刻返回 但底层的Socket实际上并不立刻关闭 socket setSoLinger true 60 调用close 后不会立刻返回 而进入阻塞状态 以下情况返回 底层Socket在阻塞时间内发送完数据底层Socket在阻塞时间内没有发送完数据 但已经阻塞了60秒close 返回后 底层Socket立刻关闭 未发送完的数据丢弃 见源文件 Socket选项设置 LingerServer javaLingerClient java 26 设置Socket的选项 5 SO RCVBUFvoidsetReceiveBufferSize intsize throwsSocketExceptionintgetReceiveBufferSize throwsSocketException 6 SO SNDBUFvoidsetSendBufferSize intsize throwsSocketExceptionintgetSendBufferSize throwsSocketException设置发送和接收缓冲区的大小与底层Socket支持与否有关 27 设置Socket的选项 7 SO KEEPALIVEvoidSetKeepAlive booleanon throwsSocketExceptionbooleangetKeepAlive throwsSocketException当该选项为true时 底层TCP实现会监视服务器与客户端的连接是否有效 当连接处于空闲状态超过了两个小时 本地的TCP实现会发送一个数据包给远程的Socket 如果远程的Socket没有发回响应 TCP实现就会持续尝试11分钟 直到接收到响应为止 如果在12分钟内未收到响应 TCP实现就会自动关闭本地Socket 断开连接 28 29 服务器对应多个客户端的TCP通信 实际中的问题 1 服务器程序应该能够对应多个客户端的连接请求 长时保持监听状态 并与之进行通信 2 服务器与不同客户端之间的通信不能相互干扰 见源文件 tcp MutilClient java MutilServer java 30 服务器端程序编写要点 1 服务器端程序要能接受多个客户端的连接请求 需要循环调用ServerSocket的accept 方法 2 服务器端程序与每个客户端会话的过程不能相互影响 需要在单独的线程中完成 3 服务器端所创建的每一个线程对象对应一个客户端Socket对象 两者共同完成服务器与客户的会话 31 实际问题 端口被占用的解决方法 端口被占用通常会抛出异常 SocketException UnrecognizedWindowsSocketserror 0 JVM Bind查看当前那些端口被占用 cmd netstat ano查看当前使用该端口的PID 2 任务管理器 进程 查看 选择列 勾选PID 确定 点PID列按PID排序 结束刚找到的PID的进程 再重新启动 32 33 实际问题 设定等待建立连接的超时时间 默认情况下 客户端的Socket构造方法会一直去等待与服务器端建立连接 直到建立成功或者出现异常 建立连接的等待时间受底层网络的传输速度 有时可能会花费较长的时间 限定等待建立连接的时间如下 1 Socketsocket newSocket 2 SocketAddressremoteAddr newInetSocketAddress localhost 9001 3 socket connect remoteAddr 10000 34 在服务器端创建线程池 服务器端创建多线程而非采用线程池的弊端 1 服务器创建和销毁工作线程的开销 包括所花费的时间和系统资源 很大 2 频繁创建和销毁线程 必将导致频繁的切换线程 在Java虚拟机以及底层操作系统的调度下 线程之间让出CPU的使用权 频繁的切换会打乱系统固有的切换周期 大约20ms 开销甚至大于创建及销毁线程的开销 3 活动的线程也消耗系统资源 每个线程本身都会占用一定的内存 每个线程大约1MB 大量的线程可能会导致内存不足 35 线程池的原理与优势 线程池为线程生命周期开销问题和系统资源不足问题提供了解决方案 工作原理 线程池中预先创建一些工作线程 它们不断地从任务列表中取出任务 然后执行该任务 一个线程执行完一个任务后不会被销毁 而是重新利用去执行下一个任务 线程池的优势 1 减少了创建和销毁线程的次数 每个工作线程都可以被一直重用 能执行多个任务 2 可根据系统的承载能力 方便地调整线程池中线程的数目 防止因为消耗过量系统资源而导致系统崩溃 36 使用JDK自带的线程池 java util concurrent包中提供了线程池的实现 1 FixedThreadPool 创建一个指定工作线程数量的线程池 每当提交一个任务就创建一个工作线程 如果工作线程数量达到线程池初始的最大数 则将提交的任务存入到池队列中 37 使用JDK自带的线程池 2 CachedThreadPool 创建一个可缓存的线程池 工作线程的数量不固定 可以灵活的往线程池中添加线程 如果工作线程空闲了指定的时间 默认为1分钟 则该工作线程将自动终止 如果有新的任务 线程池
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 自行车服务在历史文化街区的融合考核试卷
- 花卉种植的园林景观植物养护考核试卷
- 2025年工业炉窑的新型燃烧装置项目建议书
- 橡胶板在电梯门挡板中的安全性能考核试卷
- 品牌营销实际流程策划
- 环保专业知识课件
- 中医骨伤科学多媒体课件-中医骨伤科学
- 2025年石英玻璃纤维套管项目建议书
- 福建高二考试试题及答案
- 嘉定国资委考试试题及答案
- 《公主尝衣贴绣铺翠襦入宫中》2020年江西省中考文言文阅读真题(含答案与翻译)
- 昆虫标本制作展翅蝴蝶
- 计算机应用技术毕业论文-计算机应用技术论文5000字
- 《学弈》公开课课件完整版
- 手写通用收款收据word模板
- 2022 CSCO肝癌诊疗指南
- GB/T 4744-1997纺织织物抗渗水性测定静水压试验
- GB/T 17911-2006耐火材料陶瓷纤维制品试验方法
- GB/T 14206-2005玻璃纤维增强聚酯波纹板
- 自治区促进就业创业政策课件
- 陶瓷制作工艺知识课件
评论
0/150
提交评论