日期:2014-05-20  浏览次数:20720 次

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获取当前连接的输入流,并利用处理流进行封装。