java版客户端与服务器的socket通信以及上传下载

来源:互联网 发布:淘宝rouwang家的模特 编辑:程序博客网 时间:2024/05/17 07:52

http://hi.baidu.com/ttgnkmmfgwbgrtq/item/40281e036be7a7dc72e67643

近日因为项目需要,做了一个客户端与服务器之间用socket互相通信,传递消息指令,然后客户端到服务器进行上传下载操作的代码。主要负责客户端部分,下面给出一些代码供大家参考。

大致思路是,要用socket通信,传递信息,根据信息,然后客户端在执行相应的上传下载操作。用socket通信首先要建立连接,与服务器建立一个输出输入流之后,就可以传字符串指令了。然后按照流程执行操作。这段客户端代码的流程是,先发送一个字符串信息给服务器,服务器收到后,返回给我一个确认字符串bound,客户端一直监听,监听到bound后,给服务器上传一个文件,等服务器收到文件以后,再给我发送一个确认字符串信息txt,客户端还是监听,监听到txt后,再给服务器上传一个文件,总共也就是两个文件。等服务器接收到第二个文件后,服务器那边执行相应的操作,最后操作完成后,发送给客户端一个消息,客户端监听到后,去服务器相应位置下载文件(这里是图片),并显示。

具体客户端代码如下:


import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
import java.net.UnknownHostException;

import javax.swing.JFrame;

import org.apache.commons.net.ftp.FTPClient;

import display2d.J2DImageDisplayInternalFrame;

import server.JAbstractParam;

public class SocketClient_5 extends Thread {
protected String hostIp = "192.168.0.17";;
protected int hostPort = 50000;
InputStream fis;
DataInputStream in;
DataOutputStream ps;
File fi;
DataInputStream dis;
Socket client;
boolean loop = true;

public SocketClient_5() {
}

public static void main(String[] args) {

   SocketClient_5 client = new SocketClient_5();
   client.setUpConnection();
   String pathBound = "f:\\IMG_0903.JPG";
   String path = "f:\\IMG_0850.JPG"; // 测试文件
   client.sendMessage("CCD", pathBound, path);

}

/**
* 将连接到远程服务器
*/
public void setUpConnection() {
   try {
    client = new Socket(hostIp, hostPort);
    in = new DataInputStream(client.getInputStream());
    ps = new DataOutputStream(client.getOutputStream());

   } catch (UnknownHostException e) {
    System.out
      .println("Error setting up socket connection: unknown host at "
        + hostIp + ":" + hostPort);
   } catch (IOException e) {
    System.out.println("Error setting up socket connection: " + e);
   }

}

public void sendMessage(String task, String pathBound, String path) {
   // 传消息任务
   try {
    ps.writeUTF(task);
   } catch (IOException e2) {
    // TODO Auto-generated catch block
    e2.printStackTrace();
   }
   // 接收服务器发过的的确认消息bound,然后发送范围文件
   while (true) {
    try {
     if (in.readUTF().startsWith("BOUND")) {
      System.out.println("from server:BOUND");
      testUpload("/RSAS_SETE0506/data/paramers", pathBound);
      break;
     }
    } catch (IOException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
     break;
    }
   }
   // 接收服务器发过来的确认消息TXT,然后发送参数文件

   String txtPath = getTxtPath(task);
   while (true) {
    try {
     if (in.readUTF().startsWith("TXT")) {
      System.out.println("from server:TXT");
      testUpload(txtPath, path);
      break;
     }
    } catch (IOException e) {
     e.printStackTrace();
     break;
    }
   }
   // 接收服务器发过来的消息EXIT,去服务器上下载生成的文件,并自动显示
   String remotedownpath = listenSimulateFile(task);
   String localSimulate=System.getProperty("user.dir")+"/data/simuimage/simulate.tif";
   //String localSimulate = "D:/workspace/RSAS_SETE0506/data/simuimage/simulate.tif";// 测试使用
   while (true) {
    try {
     if (in.readUTF().startsWith("EXIT")) {
      System.out.println("from server:EXIT");
      // String remotedownpath =
      // JAbstractParam.getSarparamterpath();//从公共类中读取仿真图像的路径
      testDownload(remotedownpath, localSimulate);
      System.out.println("over");
      //显示下载的生成图像
      JFrame newframe = new JFrame();
      J2DImagesDisplayInternalFrame internalframe = new
      J2DImageDisplayInternalFrame(
      localSimulate);
      internalframe.setVisible(true);
      newframe.add(internalframe);
      newframe.setBounds(100, 100, 600, 600);
      newframe.setVisible(true);
      client.close();
      break;
     }
    } catch (IOException e) {
     // e.printStackTrace();
     System.out.println("no server!");
     break;
    }
   }

}

/**
* FTP上传单个文件测试
*/
public static void testUpload(String remotepath, String localpath) {
   FTPClient ftpClient = new FTPClient();
   FileInputStream fis = null;
   String localfilepath = localpath;
   String remotefilepath = remotepath;

   try {
    ftpClient.connect("192.168.0.17");
    ftpClient.login("rsClient", "rsClientUser");

    File srcFile = new File(localfilepath);
    String name = srcFile.getName();
    fis = new FileInputStream(srcFile);
    // 设置上传目录
    ftpClient.changeWorkingDirectory(remotefilepath);
    ftpClient.setBufferSize(1024);
    ftpClient.setControlEncoding("GBK");
    // 设置文件类型(二进制)
    ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
    ftpClient.storeFile(name, fis);
   } catch (IOException e) {
    e.printStackTrace();
    throw new RuntimeException("FTP客户端出错!", e);
   } finally {
    // IOUtils.closeQuietly(fis);
    try {
     ftpClient.disconnect();
    } catch (IOException e) {
     e.printStackTrace();
     throw new RuntimeException("关闭FTP连接发生异常!", e);
    }
   }
}

/**
* FTP下载单个文件测试
*/
public static void testDownload(String remotepath, String localpath) {
   FTPClient ftpClient = new FTPClient();
   FileOutputStream fos = null;

   try {
    ftpClient.connect("192.168.0.17");
    ftpClient.login("rsClient", "rsClientUser");
    String remoteFileName = remotepath;
    String localfilepath = localpath;
    fos = new FileOutputStream(localfilepath);

    ftpClient.setBufferSize(1024);
    // 设置文件类型(二进制)
    ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
    ftpClient.retrieveFile(remoteFileName, fos);
   } catch (IOException e) {
    e.printStackTrace();
    throw new RuntimeException("FTP客户端出错!", e);
   } finally {
    // IOUtils.closeQuietly(fos);
    try {
     ftpClient.disconnect();
    } catch (IOException e) {
     e.printStackTrace();
     throw new RuntimeException("关闭FTP连接发生异常!", e);
    }
   }

}
}

经测试,上传下载的方法是可以用的,监听并传递消息也可以,基本通过,还有一些路径的小细节问题,大家自行调试便是。


原创粉丝点击