📄 comclass.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 + -