java socket 每小时通信一次
初来乍到。各位大神们帮帮忙。不胜感激!
现有一项目,需要在socket通信时,server每小时发送一个文件,client每小时接收一个文件,该怎么做,求解。能写点伪代码更好了。
[解决办法]
基本思想是,每一个小时,客户端去连接服务器一次,服务器只要接收到连接,就往客户端发文件数据,客户端接收完成后,断开连接,等一个小时后再去连接,如果反复。。。 但在这种情况下,如果要保证一小时(其次没有绝对的保证)传输一次文件,需要在客户端控制好
[解决办法]
估计楼上讲的跟没讲一样,他可以需要Socket通信源码,嘿,Socket如果不太会,就用mina框架吧,别埋太多的地雷。
[解决办法]
也不清楚你为什么要用socket,如果是为了获取文件可以用Ftp下载,定时器可以用:timer.schedule,
当然根据具体情况还可以用spring的quartz,只需配置就行。部分socket代码:
public class FtpClient {
private ClientView clientView;
/**
* 两个Socket分别用来传输文件和控制信息,类似于Ftp的Tcp 20、21。 20用来传输文件,21用来传输控制信息。
* */
private Socket fileSocket, commandSocket;
// 利用dis获取当前连接的输入流,并利用处理流进行封装。
private DataInputStream dis;
// 利用dos获取当前连接的输出流,并利用处理流进行封装。
private DataOutputStream dos;
// 选取默认路径保存文件
private String fileDir = "c:/";
private boolean flag = true;
public FtpClient() {
super();
}
public FtpClient(ClientView clientView) {
super();
this.clientView = clientView;
}
// 接收文件
public void receiveFile(Socket s, String str) throws Exception {
fileSocket = s;
dis = new DataInputStream(fileSocket.getInputStream());
String existFile = dis.readUTF();
clientView.getJta().append(existFile);
// 如果文件不存在,则不用接受文件
if (existFile.startsWith("404 File does not exist"))
;
// 如果文件存在,则接受文件
else {
clientView.getJta().append("发送文件名成功\n");
// 关联保存文件夹
File f = new File(fileDir);// 当前根目录
File file = new File(f, "Downloads" + File.separator + str); // 保存到当前目录得Downloads文件里面
// 传输文件前重新构造Socket
fileSocket = new Socket(clientView.getIPtf().getText(), 5432);
// 将文件封装到输出流中
BufferedOutputStream buff = new BufferedOutputStream(
new FileOutputStream(file));
// 获取当前连接的输入流,并利用处理流进行封装。
dis = new DataInputStream(fileSocket.getInputStream());
byte[] line = new byte[102400];// 每次发送的块打大小
clientView.getJta().append("开始接收文件\n");
clientView.getJta().append("文件传送中....\n");
int mount;
while ((mount = dis.read(line)) != -1) {
buff.write(line, 0, mount);
buff.flush();// 刷新
Thread.sleep(50);// 设置一个等待时间,有利于接收文件
}
clientView.getJta().append("finished\n");
buff.close();
}
fileSocket.close();
}
// 建立连接
public void TestStart() {
clientView.getJta().append("请发送命令: \n");
}
public void getCommand(String str) {
try {
// 设置flag=false相当于程序暂停
while (flag) {
commandSocket = new Socket(clientView.getIPtf().getText(),
Integer.parseInt(clientView.getJtf().getText()));
// 利用dos获取当前连接的输出流,并利用处理流进行封装。
dos = new DataOutputStream(commandSocket.getOutputStream());
dos.writeUTF(str);
// 利用dis获取当前连接的输入流,并利用处理流进行封装。
dis = new DataInputStream(commandSocket.getInputStream());
//dir命令
if ("dir".equals(str))
printAllFile(dis);
//get<fileName>命令
else if (str.startsWith("get"))
receiveFile(commandSocket, str.substring(str.indexOf(' '))
.trim());
//exit命令
else if ("exit".equals(str)) {
commandSocket.close();
System.exit(0);
}
//错误的命令
else {
clientView.getJta().append(dis.readUTF());
}
flag = false;
clientView.getJta().append("请发送命令: \n");
}
} catch (Exception e) {
e.printStackTrace();
}
}
// 打印所有文件列表
public void printAllFile(DataInputStream dis) throws IOException {
//打印出200 OK
clientView.getJta().append(dis.readUTF());
//得到文件总数
int line = Integer.parseInt(dis.readUTF());
for (int i = 0; i < line; i++) {
try {
clientView.getJta().append(dis.readUTF());
} catch (IOException e) {
e.printStackTrace();
}
}
}
public boolean isFlag() {
return flag;
}
public void setFlag(boolean flag) {
this.flag = flag;
}
}
//现可发送dir、get <filename>、exit命令
public class FtpServer extends Thread {
private ServerView serverView;
/**
* 两个ServerSocket分别用来传输文件和控制信息,类似于Ftp的Tcp 20、21。 20用来传输文件,21用来传输控制信息。
* */
private ServerSocket commandServer, fileServer;
private Socket s;
// 利用dis获取当前连接的输入流,并利用处理流进行封装。
private DataInputStream dis;
// 利用dos获取当前连接的输出流,并利用处理流进行封装。
private DataOutputStream dos;
// 选取默认路径
private String fileDir = "c:/";
public FtpServer() {
super();
}
public FtpServer(ServerView serverView) {
super();
this.serverView = serverView;
}
// 发送文件
public void sendFile(String str) throws Exception {
try {
// 若为发送文件,则首先获取文件名。
String filename = str.substring(str.indexOf(' ')).trim();
serverView.getJta().append("接收文件名" + filename + "成功\n");
// 创建端口5432传输文件
fileServer = new ServerSocket(5432);
//封装文件
File path = new File(fileDir);// 当前根目录
File file = new File(path, filename);// 创建该文件对象
//判断文件是否存在
if (!file.exists())
dos.writeUTF("404 File does not exist\n");
else {
dos.writeUTF("200 OK 文件长度:" + file.length() + "\n");
s = fileServer.accept();
serverView.getJta().append("将文件读到缓冲流中\n");
// 将文件封装到输入流中
BufferedInputStream buffile = new BufferedInputStream(
new FileInputStream(file));
byte[] buf = new byte[102400];// 每次发送的块打大小
int mount;
//获取当前连接的输出流,并利用处理流进行封装。
dos = new DataOutputStream(s.getOutputStream());
serverView.getJta().append("开始传送文件\n");
while ((mount = buffile.read(buf)) != -1) {// 传送文件,将文件内容以字节形式保存到buf中再发送
dos.write(buf, 0, mount);
Thread.sleep(50);// 设置一个等待时间,有利于发送文件文件
}
serverView.getJta().append("文件传送完毕\n");
s.close();// 关闭清理工作
buffile.close();
}
fileServer.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public void run() {
try {
commandServer = new ServerSocket(4321);// 4321端口用来接接收命令
serverView.getJta().append("Listen at 4321 port\n");
while (true) {
s = commandServer.accept();// 监听
// 利用dis获取当前连接的输入流,并利用处理流进行封装。
dis = new DataInputStream(s.getInputStream());
// 利用dos获取当前连接的输出流,并利用处理流进行封装。
dos = new DataOutputStream(s.getOutputStream());
byte[] buf = new byte[100];
int len = dis.read(buf);
String str = new String(buf, 0, len).trim();
serverView.getJta().append("接收" + str + "命令成功\n");
//dir命令
if ("dir".equals(str)) {
dos.writeUTF("200 OK\n");
transAllFile(s);
}
//get<fileName>命令
else if (str.startsWith("get")) {
sendFile(str);
}
//exit命令
else if ("exit".equals(str)) {
s.close();// 处理Exit命令
}
//错误的命令
else {
dos.writeUTF("400 Command error\n");
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
// 处理Dir命令
public void transAllFile(Socket s1) throws IOException {
File localfile = new File(fileDir);
File[] filelist = localfile.listFiles();
dos = new DataOutputStream(s1.getOutputStream());// 输出文件列表
//传送文件总数
dos.writeUTF(filelist.length + "");
dos.writeUTF("-------------------File List--------------------\n");
for (int i = 0; i < filelist.length; i++) {
dos.writeUTF("文件名:" + filelist[i].getName() + " 文件长度:"
+ filelist[i].length() + "字节\n");
}
}
}
希望有所帮助
