题目:从本地读取图片,通过Socket由服务器发送给客户端,客户端重命名图片,保存到当前路径。
使用BufferedReader字符流操作,发现图片获取失败,查了一下做个小结。
参考文件
https://bbs.csdn.net/topics/370110335
https://www.cnblogs.com/dongrilaoxiao/p/6688107.html
/**
* @author Administrator
* @version 1.0
*
* 创建一个多线程的TCP 服务器以及客户端,完成下面的功能: 服务端:读入客户端发给
* 服务器端的字符串,在服务器当前目录下查找以该字符串作为文件名的文件,并把该文
* 件内容发送给客户端。客户端:发送给服务器端一个字符串filename 表示服务器上的
* 一个文件,然后 从服务器端读入文件内容,并起名叫server_filename 保存在当前
* 目录。
*/
public class FileThreadServer {
public static void main(String[] args){
ExecutorService es = Executors.newCachedThreadPool();
ServerSocket listener = null;
Socket socket = null;
try {
listener = new ServerSocket(7788);
System.out.println("服务器已启动");
while (true) {
socket = listener.accept();
es.submit(new FileThread(socket));
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
if(socket != null)
socket.close();
if(listener != null)
listener.close();
if(es != null)
es.shutdown();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
class FileThread implements Runnable{
private Socket socket;
public FileThread() {
}
public FileThread(Socket socket) {
this.socket = socket;
}
public Socket getSocket() {
return socket;
}
public void setSocket(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
BufferedReader br = null;
BufferedOutputStream bos = null;
BufferedInputStream bis = null;
try {
InputStream is = socket.getInputStream();
br = new BufferedReader(new InputStreamReader(is));
//接收客户端发送的文件名
String fileName = br.readLine();
System.out.println("fileName:"+fileName);
//当前目录查找文件是否存在
boolean fileExistResult = checkFile(fileName);
if(fileExistResult){
OutputStream os = socket.getOutputStream();
bos = new BufferedOutputStream(os);
//将文件写到E盘
bis = new BufferedInputStream(
new FileInputStream(new File("e:\\"+fileName)));
int len = 0;
byte[] b = new byte[1024*4];
//使用缓冲字节流读取写入
while((len = bis.read(b))!=-1){
bos.write(b, 0, len);
}
bos.flush();
System.out.println("服务器发送数据完毕");
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
if(br != null)
br.close();
if(bis != null)
bis.close();
if(bos != null)
bos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public boolean checkFile(String fileName){
File file = new File("e:\\");
if(!file.exists()){
System.out.println("搜索路径存在问题,无法查找");
return false;
}
File[] files = file.listFiles();
if(files == null){
return false;
}
for (File f : files) {
if(f.getName().equals(fileName)){
return true;
}
}
return false;
}
}
/**
* @author Administrator
* @version 1.0
*
* 创建一个多线程的TCP 服务器以及客户端,完成下面的功能: 服务端:读入客户端发给服
* 务器端的字符串,在服务器当前目录下查找以该字符串作为文件名的文件,并把该文件内
* 容发送给客户端。客户端:发送给服务器端一个字符串filename 表示服务器上的一个文
* 件,然后 从服务器端读入文件内容,并起名叫server_filename 保存在当前目录。
*/
public class FileClient {
public static void main(String[] args){
Socket socket = null;
BufferedWriter bw = null;
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try {
socket = new Socket("127.0.0.1", 7788);
bw = new BufferedWriter(
new OutputStreamWriter(socket.getOutputStream()));
bw.write("ascii.jpg");
bw.newLine();
bw.flush();
System.out.println("客户端发送文件名完毕");
bis = new BufferedInputStream(socket.getInputStream());
bos = new BufferedOutputStream(
new FileOutputStream(
new File("d:\\server_ascii.jpg")));
int len = 0;
byte[] b = new byte[1024*4];
while((len = bis.read(b)) != -1){
bos.write(b, 0, len);
}
bos.flush();
System.out.println("客户端保存文件完毕");
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
if(bw != null)
bw.close();
if(bis != null)
bis.close();
if(bos != null)
bos.close();
if(socket != null)
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}