import java.io.IOException;
import java.io.InterruptedIOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Scanner;
/**
*
* @author
*记录客户端一组状态信息
*/
class ClientState{
public boolean cmdError = false;
public boolean paraError = false;
public boolean isChanged = false;
public boolean connfinished = false;
public boolean connected = false;
public boolean connDone = true;
public boolean connfaile = false;
public boolean downfinished = false;
public boolean upfinished = false;
public boolean exit = false;
public final int port = IdInfo.PORT;
public final int timeout = IdInfo.TIMEOUT;
public final int maxtrims = 3;
private InetAddress ipInetAddress = null;
private int cmdState = -1;
private String cmdParaState;
private int count = 0;
public ClientState() {
// TODO Auto-generated constructor stub
}
public InetAddress getIpInetAddress() {
return ipInetAddress;
}
public void setIpInetAddress(InetAddress ipInetAddress) {
this.ipInetAddress = ipInetAddress;
}
public int getCmdState() {
return cmdState;
}
public void setCmdState(int cmdState) {
this.cmdState = cmdState;
}
public String getCmdParaState() {
return cmdParaState;
}
public void setCmdParaState(String cmdParaState) {
this.cmdParaState = cmdParaState;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
}
public class TFTPClient extends Thread{
//客户端
private DatagramSocket client = null;
//记录要上传或下载文件的内容 和 长度
private ArrayList<byte[]> fileContent = new ArrayList<byte[]>();
private int endlengh = 0;
//记录来自服务器共享文件的相对路径
private ArrayList<String> listFileName = new ArrayList<String>();
//path
private String path = "D:\\tftp";
//定义客户端状态
private ClientState clientState = new ClientState();
//接收来自控制台的命令串
private String cmd;
public TFTPClient() {
// TODO Auto-generated constructor stub
try {
client = new DatagramSocket();
client.setSoTimeout(clientState.timeout);
} catch (SocketException e) {
// TODO Auto-generated catch block
System.out.println("客户端创建失败!!!");
System.exit(0);
e.printStackTrace();
}
}
public void setCmd(String cmd) {
this.cmd = cmd;
}
public void run(){
while(true){
dealCmdStr(cmd);
if(clientState.cmdError){
break;
}else{
if(clientState.paraError){
break;
}
if(!clientState.connDone){
break;
}
if(clientState.connfaile){
break;
}
if(clientState.connfinished){
break;
}
if(clientState.exit){
break;
}
if(clientState.connected){
break;
}
}
}
}
/**
* 处理命令串
* @param cmdStr
*/
private void dealCmdStr(String cmdStr){
CmdToo cmdToo = new CmdToo(cmdStr);
switch (cmdToo.getCmdState()) {
case 0:
dealConnCmd(cmdToo);
break;
case 1:
if(clientState.getIpInetAddress() == null){
clientState.connDone = false;
System.out.println("------请先连接服务器------");
}else{
dealUpCmd(cmdToo);
}
break;
case 2:
if(clientState.getIpInetAddress() == null){
clientState.connDone = false;
System.out.println("------请先连接服务器------");
}else{
dealDownCmd(cmdToo);
}
break;
case -1:
clientState.cmdError = true;
System.out.println("--------命令错误,命令有conn,up 和 down------");
break;
case -2:
clientState.exit = true;
break;
default:
break;
}
}
public boolean isexit(){
return clientState.exit;
}
/**
* 处理上传命令
* @param cmdToo
*/
private void dealUpCmd(CmdToo cmdToo) {
// TODO Auto-generated method stub
clientState.upfinished = false;
String fileName = cmdToo.getFilePath();
System.out.println("打开的客户端文件:" +fileName);
if(fileContent.size() == 0){
endlengh = FileTool.readFileByByte(fileName, fileContent, endlengh);//(fileName, fileContent);
}else{
fileContent.clear();
endlengh = FileTool.readFileByByte(fileName, fileContent, endlengh);//(fileName, fileContent);
}
clientState.setCount(0);
DatagramPacket rPacket = null;
do{
System.out.println("正在处理的命令串:"+cmdToo.getFormSubCmdStr());
sendMessage(cmdToo.getFormSubCmdStr());
rPacket = getRecievePacket();
if(rPacket != null){
dealingUp(rPacket);
}
}while(!clientState.upfinished);
}
private void dealingUp(DatagramPacket rPacket){
do{
int id = clientState.getCount();
sendFileContent(id);
rPacket = getRecievePacket();
if(rPacket != null){
if(id < fileContent.size()){
clientState.setCount(id + 1);
}else{
clientState.upfinished = true;
System.out.println("------上传完成-----");
}
}
}while(!clientState.upfinished);
}
/**
* 处理conn命令串
* @param cmd
*/
private void dealConnCmd(CmdToo cmdToo){
if(cmdToo.isIp()){
try {
clientState.setCmdState(cmdToo.getCmdState());
clientState.setIpInetAddress(InetAddress.getByName(cmdToo.getPara()));
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
DatagramPacket rPacket = startDealingConn(cmdToo.getFormCmdStr());
if(rPacket != null){
do{
dealingConn(rPacket);
if(!clientState.connfinished){
rPacket = getRecievePacket();
if(rPacket == null){
sendMessage(MessageType.ACK);
}
}else{
if(clientState.connected){
System.out.println("-----------------已连接-------------");
break;
}else if(clientState.connfinished){
System.out.println("----------conn完成--------");
System.out.println("----------服务器可以下载的文件:---------");
for(String str : listFileName){
System.out.println(str);
}
System.out.println("----------输入up或down,上传或下载文件---");
break;
}
break;
}
}while(true);
}else{
System.out.println("--------连接失败------");
clientState.connfaile = true;
}
}else{
clientState.paraError = true;
System.out.println("----------ip格式错误--------");
return ;
}
}
/**
* 开始连接。。。
* @param data
* @return 返回接收到的数据包
*/
private DatagramPacket startDealingConn(String data){
boolean isConnected = false;
DatagramPacket rPacket;
int tries = 0;
do{
sendMessage(data);
rPacket = getRecievePacket();
if(rPacket != null){
isConnected = true;
}else{
tries++;
}
}while((!isConnected) && tries < clientState.maxtrims);
if(isConnected){
return rPacket;
}else{
return null;
}
}
/**
* 正在处理交互数据
* @param rPacket
*/
private void dealingConn(DatagramPacket rPacket){
String message = new String(rPacket.getData(), 0, rPacket.getLength());
MessageTool mTool = new MessageTool(message);
switch (mTool.getStateType()) {
case 1:
break;
case 2:
clientState.connfinished = true;
break;
case 3:
clientState.connected = true;
break;
case -1:
listFileName.add(message);
sendMessage(MessageType.ACK);
break;
default:
break;
}
}
/**
* 处理donw命令串
* @param cmdToo
*/
private void dealDownCmd(CmdToo cmdToo){
DatagramPacket rPacket = null;
clientState.downfinished = false;
if(fileContent.size() == 0){
}else{
fileContent.clear();
}
do {
clientState.setCmdParaState(cmdToo.getFileName());
clientState.setCmdState(cmdToo.getCmdState());
sendMessage(cmdToo.getFormCmdStr());
rPacket = getRecievePacket();
if(rPacket != nu
没有合适的资源?快使用搜索试试~ 我知道了~
基于JavaUDP开发的TFTp
共7个文件
java:7个
需积分: 32 17 下载量 186 浏览量
2017-06-12
10:20:55
上传
评论
收藏 9KB ZIP 举报
温馨提示
基于JavaUDP开发的TFTp
资源推荐
资源详情
资源评论
收起资源包目录
TFTP.zip (7个子文件)
MessageType.java 264B
CmdToo.java 2KB
TFTPClient.java 11KB
FileTool.java 6KB
MessageTool.java 1024B
TFTPServer.java 9KB
IdInfo.java 468B
共 7 条
- 1
资源评论
天虚
- 粉丝: 0
- 资源: 4
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功