⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 receivethread.java

📁 本程序可在局域网内实现聊天、传送文件功能
💻 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 + -