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

📄 comclass.java

📁 用java写的SFTP代码
💻 JAVA
字号:
import java.net.*;
import java.io.*;
/**
 *提供网络传输的功能
 *
 */

public class ComClass {
	DatagramSocket ds 	  = null;
	int otherport = 69;
    InetAddress addr  	  = null;
    DatagramPacket packet = null;
	
	// 构造方法
	public ComClass( int port )	{
		try {
			ds = new DatagramSocket(port);
		}catch(SocketException e) {
			System.out.println("套接字不能被打开,或不能将其绑定到指定的本地端口");
			return;
		}
	}

	//关闭数据报的连接
	public void closeSocket() {
		ds.close();
		addr = null;
	}
	
	//返回最后收到的包的地址
	public InetAddress giveLastPacketAddress() {
		return packet.getAddress();
	}
	
	//返回最后收到的包的长度
	public int readBufferlength() {
		return packet.getLength();
	}
	
	//接收一个数据包
	public byte[] receivePacket() {
		byte[] bufrev = new byte[516];
    	packet = new DatagramPacket( bufrev, 516) ;
        try {
            ds.receive(packet);
            if(packet.getData()[1]==PacketCode.RRQ || //保存对方的端口号
            	packet.getData()[1]==PacketCode.WRQ) {
            	otherport = packet.getPort();
            }
            System.out.print("收到包");
            System.out.print(packet.getData()[1]+"-");
            System.out.println(packet.getData()[3]);
         }catch(IOException e) {
         	System.out.println("收包错误!");
            e.printStackTrace();
        }
        return bufrev;
	}
	
	//发一个 RRQ/WRQ 包(客户端)
	// 2 bytes    string   1 byte   string  1 byte
	//------------------------------------------------(包的头的定义)
	//| Opcode | Filename |   0   |  Mode  |   0   |
	//------------------------------------------------
	//本实践只用ascii的模式,Mode及之后的省略
	public void sendPacketRW(String filename,byte Opcode0,byte Opcode1) {
		byte[] bfilename = filename.getBytes();	//文件名转为字节序列
		byte[] bufout 	 = new byte[256];		//用于发的包的内容
		bufout[0] = Opcode0;					//包的类型码01/02
		bufout[1] = Opcode1;
		for(int i = 0; i< filename.length();i++) {
			bufout[i+2] = bfilename[i];
		}
		bufout[filename.length()+2]=0;			//ascii的null
		int length = filename.length()+3;		//有效的包长
		DatagramPacket p = new DatagramPacket(bufout, length ,addr, 69);
        try {
            ds.send(p);
            System.out.println("发送RRQ/WRQ包");
        }catch (IOException e) {
        	System.out.println("发RRQ/WRQ包出错!");
            e.printStackTrace();
        } 
	}
	
	//发一个 DATA 包(发端)
	// 2 bytes  2 bytes       n bytes
	//------------------------------------(包的头的定义)
	//| Opcode |  Block #  |    Data    |
	//------------------------------------
	
	public void sendPacketDATA(byte[] filedata,byte Block0,byte Block1) {
		byte[] bufdata 	 = new byte[516];	//用于发的包的内容
		bufdata[0] = 0;						//包的类型码03
		bufdata[1] = 3;
		bufdata[2] = Block0;				//数据块号,用于连续的数据发送
		bufdata[3] = Block1;
		for(int i = 0; i<=511;i++) {
			bufdata[i+4] = filedata[i];
		}
		DatagramPacket p = new DatagramPacket( bufdata, 516 , addr, otherport);
        try { 
 	        ds.send(p);
            System.out.print("发送DATA包");
            System.out.println(bufdata[3]);
        }catch (IOException e) {
        	System.out.println("发DATA包出错!");
            e.printStackTrace();
        }
	}
	
	//发一个 ACK 包(收端)
	// 2 bytes  2 bytes   
	//--------------------(包的头的定义)
	//| Opcode |  Block #  
	//--------------------
	
	public void sendPacketACK(byte Block0,byte Block1) {
		byte[] bufack = new byte[4];		//用于发的包的内容
		bufack[0] = 0;						//包的类型码04
		bufack[1] = 4;
		bufack[2] = Block0;					//数据块号,用于连续的数据块确认
		bufack[3] = Block1;		
		DatagramPacket p = new DatagramPacket( bufack, 4, addr, otherport);
        try { 
            ds.send(p);
            System.out.print("发送ACK包");
            System.out.println(bufack[3]);
        }catch (IOException e) {
        	System.out.println("发ACK包出错!");
            e.printStackTrace();
        } 
	}
	
	//发一个 ERROR 包(错误信息,供程序员使用)
	// 2 bytes    2 bytes    string  1 byte
	//-----------------------------------------
	//| Opcode | ErrorCode | ErrMsg |   0   |
	//-----------------------------------------
	
	public void sendPacketERR(byte errcode0,byte errcode1,String errmsg) {
		byte[] buferr = new byte[256];			//用于发的包的内容
		buferr[0] = 0;							//包的类型码05
		buferr[1] = 5;
		buferr[3] = errcode0;					//错误码
		buferr[4] = errcode1;
		byte[] berrmsg = errmsg.getBytes();		//错误信息转为字节序列
		for(int i = 0; i < errmsg.length();i++)	{
			buferr[i+4] = berrmsg[i];
		}
		buferr[errmsg.length()+4]=0;			//null
		int length = errmsg.length()+5;		//有效的包长		
		DatagramPacket p = new DatagramPacket( buferr, length, addr, otherport);
        try { 
            ds.send(p);
            System.out.println("发送ERR包");
        }catch (IOException e) {
        	System.out.println("发ERR包出错!");
            e.printStackTrace();
        } 
	}	
	
	//保存对方的地址
	public void writeOtherSiteAddress(String addr) {
		try	{
			this.addr = InetAddress.getByName(addr);	
		}catch(UnknownHostException e) {
			System.out.println("地址不明!");
		}
	}	
}

⌨️ 快捷键说明

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