扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
连接拒绝,我上次遇到的是自己的IP地址看错啦,你看下IP地址和端口是否正确,同时看下端口是否被其它程序占用。
创新互联公司主要从事成都网站建设、做网站、网页设计、企业做网站、公司建网站等业务。立足成都服务大竹,10年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:13518219792
1、所谓“暂停”,就是程序暂等待。
2、在java中暂停,有几种方法,如线程wait或是sleep或是yield等,自己百度查一下这些方法的用法,就可以解决你的问题了~
试试吧
停止等待协议(stop-and-wait)是最简单但也是最基础的数据链路层协议。很多有关协议的基本概念都可以从这个协议中学习到。
要点
只有收到序号正确的确认帧 ACKn 后,才更新发送状态变量 V(S)一次,并发送新的数据帧。
接收端接收到数据帧时,就要将发送序号 N(S) 与本地的接收状态变量 V(R) 相比较。
若二者相等就表明是新的数据帧,就收下,并发送确认。
否则为重复帧,就必须丢弃。但这时仍须向发送端发送确认帧 ACKn,而接收状态变量 V(R) 和确认序号 n 都不变。
连续出现相同发送序号的数据帧,表明发送端进行了超时重传。连续出现相同序号的确认帧,表明接收端收到了重复帧。
发送端在发送完数据帧时,必须在其发送缓存中暂时保留这个数据帧的副本。这样才能在出差错时进行重传。只有确认对方已经收到这个数据帧时,才可以清除这个副本。
实用的 CRC 检验器都是用硬件完成的。
CRC 检验器能够自动丢弃检测到的出错帧。因此所谓的“丢弃出错帧”,对上层软件或用户来说都是感觉不到的。
发送端对出错的数据帧进行重传是自动进行的,因而这种差错控制体制常简称为ARQ (Automatic Repeat reQuest),直译是自动重传请求,但意思是自动请求重传。
[编辑本段]
定量分析
设 tf 是一个数据帧的发送时间,且数据帧的长度是固定不变的。显然,数据帧的发送时间 tf 是数据帧的长度 lf (bit)与数据的发送速率 C (bit/s)之比,即
tf = lf /C = lf /C (s)
发送时间 tf 也就是数据帧的发送时延。
数据帧沿链路传到结点B还要经历一个传播时延 tp。
结点 B 收到数据帧要花费时间进行处理,此时间称为处理时间 tpr,发送确认帧 ACK 的发送时间为 ta。
[编辑本段]
停止等待协议的算法
这里不使用否认帧(实用的数据链路层协议大都是这样的),而且确认帧带有序号 n。
按照习惯的表示法,ACKn 表示“第 n – 1 号帧已经收到,现在期望接收第 n 号帧”。
ACK1 表示“0 号帧已收到,现在期望接收的下一帧是 1 号帧”;
ACK0 表示“1 号帧已收到,现在期望接收的下一帧是 0 号帧”。
[编辑本段]
ARQ 的优缺点
优点:比较简单 。
缺点:通信信道的利用率不高,也就是说,信道还远远没有被数据比特填满。
为了克服这一缺点,就产生了另外两种协议,即连续 ARQ 和选择重传 ARQ。
[编辑本段]
具有最简单流量控制的数据链路层协议
假定 1: 链路是理想的传输信道,所传送的任何数据既不会出差错也不会丢失。
假定 2: 不管发方以多快的速率发送数据,收方总是来得及收下,并及时上交主机。
这个假定就相当于认为:接收端向主机交付数据的速率永远不会低于发送端发送数据的速率。
现在去掉上述的第二个假定。但是,仍然保留第一个假定,即主机 A 向主机 B传输数据的信道仍然是无差错的理想信道。然而现在不能保证接收端向主机交付数据的速率永远不低于发送端发送数据的速率。
[编辑本段]
由收方控制发方的数据流
乃是计算机网络中流量控制的一个基本方法。
简单解释:收方每接受到发方一帧后,回复确认帧,让发方继续发送下一帧,并且收方将数据帧交给上层软件识别,出现错误就将帧丢掉.
在接收结点:
(1) 等待。
(2) 若收到由发送结点发过来的数据帧,
则将其放入数据链路层的接收缓存。
(3) 将接收缓存中的数据帧上交主机。
(4) 向发送结点发一信息,表示数据帧已
经上交给主机。
(5) 转到(1)
在发送结点:
(1) 从主机取一个数据帧。
(2) 将数据帧送到数据链路层的发送缓存。
(3) 将发送缓存中的数据帧发送出去。
(4) 等待。
(5) 若收到由接收结点发过来的信息(此信息
的格式与内容可由双方事先商定好),则
从主机取一个新的数据帧,然后转到(2)。
JAVA中线程开始有start方法,暂停用sleep(time)方法,线程停止用stop方法,线程等待wait方法,java 中没有线程重启一说,只能说线程唤醒notifyAll()或是notify方法,前一个notifyAll()方法是唤醒所有的已休眠或是等待状态下的线程。具体的一种参数请参照JDK文档。
Java中的线程的生命周期大体可分为5种状态。如下:
1.新建(NEW):新创建了一个线程对象。
2.可运行(RUNNABLE):线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取cpu 的使用权 。
3.运行(RUNNING):可运行状态(runnable)的线程获得了cpu 时间片(timeslice) ,执行程序代码。
4.阻塞(BLOCKED):阻塞状态是指线程因为某种原因放弃了cpu 使用权,也即让出了cpu timeslice,暂时停止运行。直到线程进入可运行(runnable)状态,才有机会再次获得cpu timeslice 转到运行(running)状态。阻塞的情况分三种:
(一).等待阻塞:运行(running)的线程执行o.wait()方法,JVM会把该线程放入等待队列(waitting queue)中。
(二).同步阻塞:运行(running)的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池(lock pool)中。
(三).其他阻塞:运行(running)的线程执行Thread.sleep(long ms)或t.join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入可运行(runnable)状态。
5.死亡(DEAD):线程run()、main() 方法执行结束,或者因异常退出了run()方法,则该线程结束生命周期。死亡的线程不可再次复生。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流