📄 receivethread.java
字号:
package org.tuna.net.rdt;
import java.net.*;
/**
* 接收线程,负责接收服务器发来的数据,并分别定向至确认队列和数据队列
*/
class ReceiveThread extends Thread implements DataSort
{
private RdtUnit rdtUnit;
private boolean alive = true; //RUN方法退出标志,为假时线程退出
private byte[] rcvbyte;
public ReceiveThread(RdtUnit ru)
{
rdtUnit = ru;
}
public void setRcvByte(byte[] rcv)
{
rcvbyte = rcv;
}
public void tstop()
{
alive = false;
}
public void run()
{
try
{
while(alive)
{
rcvbyte = new byte[1024];
//获得数据,客户端使用套接字,而服务器则来自于上层的传递
if (rdtUnit.sort.equals("client"))
{
DatagramPacket rcvpkt = new DatagramPacket(rcvbyte, rcvbyte.length);
rdtUnit.sock.receive(rcvpkt);
}
else
{ //顶层欢迎套接字调用setRcvByte()后,唤醒此线程
synchronized( this ){
try{
wait();
}
catch(Exception e){}
}
}
//这里对三种消息做出响应
switch(rcvbyte[0])
{
case PKT_SURE :
//包装为确认信息,装入确认信息队列
rdtUnit.sendWindow.ensure(new RdtPacket(rcvbyte));
break;
case PKT_DATA :
rdtUnit.rcvWindow.arrive(new RdtPacket(rcvbyte));
break;
case PKT_SHUT :
alive = false;
rdtUnit.stopBlock();
//if (rdtUnit.sort.equals("client"))
//rdtUnit.sock.close();
break;
}
}
}
catch(Exception e)
{
//e.printStackTrace();
}
}
/**
* 检查数据报是否从指定的IP和端口发来
* @param pkt 待检查的数据报
*/
private boolean packetOK(DatagramPacket pkt)
{
return rdtUnit.addr == pkt.getAddress() && rdtUnit.port == pkt.getPort();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -