近日因为项目需要,做了一个客户端与服务器之间用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);
}
}
}
}
经测试,上传下载的方法是可以用的,监听并传递消息也可以,基本通过,还有一些路径的小细节问题,大家自行调试便是。