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

📄 rudpreceiver.java

📁 基于UDP的可靠邮件系统
💻 JAVA
字号:
package org.hwmhere.udp.receive;

import java.io.*;
import java.net.*;

import org.hwmhere.udp.UDPConstant;
import org.hwmhere.util.math.BaseType;

public class RUDPReceiver {

	private int port;

	private InetAddress sender;

	private byte[] receiveData;// = new byte[UDPConstant.DATA_SIZE];

	private int dataLength = 0;

	private byte[] tempReceiveData = new byte[UDPConstant.DATA_SEGMENT_LENGTH];

	private byte[] echoData;// = new byte[UDPConstant.ECHO_LENGTH];

	private DatagramSocket serverSocket;

	private DatagramPacket receivePacket;

	private DatagramPacket sendPacket;

	/**
	 * 用于发送报文序号的计数 如果初始为0,在RDT2.0中只加不减 只有当一个数据报成功接收并返回ACK后才加一
	 * 
	 * @see #upSequence()
	 * @see #downSequence()
	 */
	private int sequence = 0;

	public RUDPReceiver(int port) throws SocketException {

		this.port = port;

		serverSocket = new DatagramSocket(port);

		receivePacket = new DatagramPacket(tempReceiveData,
				tempReceiveData.length);

	}

	public void close() {
		serverSocket.close();
	}

	public void reveive() {

		try {
			boolean isLast = false;
			while (!isLast) {
				// INFORMation
				System.out.println("Receive Datagram " + sequence);
				serverSocket.receive(receivePacket);
				// UPD R 处理
				// TODO:注意,这里只能保证一个用户连接,否则会出错,产生数据交叉
				InetAddress tempSender = receivePacket.getAddress();
				int tempPort = receivePacket.getPort();
				if (0 == sequence) {
					sender = tempSender;
					port = tempPort;
				}
				if (!legalSource(tempSender, port)) {
					continue;
				}
				if (isReliable(receivePacket)) {
					// 保存受到的信息
					this.setReceiveData(receivePacket);
					echoData = UDPConstant.ACK.getBytes();
					sendPacket = new DatagramPacket(echoData, echoData.length,
							tempSender, port);
					serverSocket.send(sendPacket);
					upSequence();
					// 最后一个数据报文的回复,结束
					// 这里也正确接受了,能够保证数据有效
					// 故可以关闭socket,如果发送者不能够正确接受到ACK,可以采取再发或者直接关闭
					if (isTheLast(receivePacket)) {
						isLast = true;
						System.out.println("文件接收完毕!");
						this.close();
					}
				} else {
					echoData = UDPConstant.NAK.getBytes();
					sendPacket = new DatagramPacket(echoData, echoData.length,
							tempSender, port);
					serverSocket.send(sendPacket);
				}
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	private boolean legalSource(InetAddress sender, int port) {
		if (this.sender == sender && this.port == port)
			return true;
		return false;
	}

	// 判断是否可靠
	// TODO:
	private int returnSequence(DatagramPacket packet) {

		byte[] tempSequence = new byte[4];

		tempSequence[0] = packet.getData()[0];
		tempSequence[1] = packet.getData()[1];
		tempSequence[2] = tempSequence[3] = (byte) 0;

		return BaseType.lBytesToInt(tempSequence);

	}

	boolean isReliable(DatagramPacket packet) {

		int tempSequence = returnSequence(packet);

		if (tempSequence != sequence) {
			return false;
		}

		// if

		return true;
	}

	// 判断是否是最后一个包
	// TODO:1.0
	boolean isTheLast(DatagramPacket packet) {

		int tempFlage = (int) packet.getData()[2];

		if (tempFlage == 1) {
			return true;
		}
		return false;
	}

	public void setReceiveData(DatagramPacket packet) throws IOException {

		byte[] tempData = packet.getData();

		ByteArrayOutputStream bos = new ByteArrayOutputStream();
		if (receiveData != null) {
			bos.write(receiveData);
		}

		System.out
				.println("tempReceiveData 长度:" + (packet.getLength() - 3));

		//TODO:OFFSET
		bos.write(tempData,packet.getOffset()+3,packet.getLength()-3);

		receiveData = bos.toByteArray();

	}

	public static void main(String args[]) throws Exception {

		while (true) {

			RUDPReceiver receiver = new RUDPReceiver(6790);

			receiver.reveive();

			byte[] receivedData = receiver.getReceiveData();

			String string = new String(receivedData);

			System.out.println(string);
			System.out.println("接收到数据长度:" + receivedData.length);

		}

	}

	public byte[] getReceiveData() {
		return receiveData;
	}

	public byte[] getechoData() {
		return echoData;
	}

	public void setechoData(byte[] echoData) {
		this.echoData = echoData;
	}

	public int getPort() {
		return port;
	}

	public void setPort(int port) {
		this.port = port;
	}

	public DatagramPacket getReceivePacket() {
		return receivePacket;
	}

	private void upSequence() {
		sequence++;
	}

	private void downSequence() {
		sequence--;
	}

	public InetAddress getSender() {
		return sender;
	}

	public void setSender(InetAddress sender) {
		this.sender = sender;
	}

	public int getDataLength() {
		return dataLength;
	}

	public void setDataLength(int dataLength) {
		this.dataLength = dataLength;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -