创建两个类 分别添加main方法 一个作为server类一个作为client类
客户端先发送再接收 服务器端先接收再发送
下面给你一个server和client的例子 你在基础上改一下就行了
client发送的时候发送三边值 server接收后 写一个计算三角形面积的函数 把接收到的三边值传入函数计算出结果作为数据返回到client端
/***UDPServer
*/
import java.io.*
import java.net.*
class UDPServer{
public static void main(String[] args)throws IOException{
DatagramSocket server = new DatagramSocket(5050)
byte[] recvBuf = new byte[100]
DatagramPacket recvPacket
= new DatagramPacket(recvBuf , recvBuf.length)
server.receive(recvPacket)
String recvStr = new String(recvPacket.getData() , 0 , recvPacket.getLength())
System.out.println("Hello World!" + recvStr)
int port = recvPacket.getPort()
InetAddress addr = recvPacket.getAddress()
String sendStr = "Hello ! I'm Server"
byte[] sendBuf
sendBuf = sendStr.getBytes()
DatagramPacket sendPacket
= new DatagramPacket(sendBuf , sendBuf.length , addr , port )
server.send(sendPacket)
server.close()
}
} /**
*UDPClient
*/
import java.io.*
import java.net.*
class UDPClient{
public static void main(String[] args)throws IOException{
DatagramSocket client = new DatagramSocket()
String sendStr = "Hello! I'm Client"
byte[] sendBuf
sendBuf = sendStr.getBytes()
InetAddress addr = InetAddress.getByName("127.0.0.1")
int port = 5050
DatagramPacket sendPacket
= new DatagramPacket(sendBuf ,sendBuf.length , addr , port)
client.send(sendPacket)
byte[] recvBuf = new byte[100]
DatagramPacket recvPacket
= new DatagramPacket(recvBuf , recvBuf.length)
client.receive(recvPacket)
String recvStr = new String(recvPacket.getData() , 0 ,recvPacket.getLength())
System.out.println("收到:" + recvStr)
client.close()
}
}
对一个连接而言,若能够了解端点间的传输往返时间(RTT,Round Trip Time),则可根据RTT来设置一合适的RTO。显然,在任何时刻连接的RTT都是随机的,无法事先预知。TCP通过测量来获得连接当前RTT的一个估计值,并以该RTT估计值为基准来设置当前的RTO。自适应重传算法的关键就在于对当前RTT的准确估计,以便适时调整RTO。为了搜集足够的数据来精确地估算当前的RTT,TCP对每个报文都记录下发送出的时间和收到的确认时间。每一个(发送时间,确认时间)对就可以计算出一个RTT测量值的样本(Sample RTT)。TCP为每一个活动的连接都维护一个当前的RTT估计值。该值是对已经过去的一个时间段内该连接的RTT了两只的加权平均,并作为TCP对连接当前实际的RTT值的一种估计。RTT估计值将在发送报文段时被用于确定报文段的RTO。为了保证它能够比较准确地反应当前的网络状态,每当TCP通过测量获得了个新的RTT样本时,都将对RTT的估计值进行更新。不同的更新算法或参数可能获得不同的特性。
最早的TCP曾经用了一个非常简单的公式来估计当前网络的状况,如下
R<-aR+(1-a)MRTP=Rb其中a是一个经验系数为0.1,b通常为2。注意,这是经验,没有推导过程,这个数值是可以被修改的。这个公式是说用旧的RTT(R)和新的RTT (M)综合到一起来考虑新的RTT(R)的大小。但又可以看到,这种估计在网络变化很大的情况下完全不能做出“灵敏的反应”,于是就有下面的修正公式:
Err=M-AA<-A+gErrD<-D+h(|Err|-D)RTO=A+4D,这个递推公式甚至把方差这种统计概念也使用了进来,使得偏差更加的小。而且,必须要指出的是,这两组公式更新,都是在 数据成功传输的情况下才进行,在发生数据重新传输的情况下,并不使用上面的公式进行网络估计,理由很简单,因为程序已经不在正常状态下了,估计出来的数据 也是没有意义的。
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)