上一篇通过Socket,服务端和客户端进行了简单的交流。
在这一篇中,将进行文件的传输。也就是文件下载。
服务端
因为服务端会一直开着,开着的同时会有很多客户端过来连接进行文件的下载。因此在服务端开启线程。(客户端每发一条请求,服务端都有对应的一条线程进行处理)
package socket2;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class MyServer {
public static void main(String[] args) throws IOException {
//绑定服务的端口,ip:为本机Ip
//暴漏了一个 服务,该服务的地址: 本机ip:9999
ServerSocket server = new ServerSocket(9999);
while(true) {
Socket socket = server.accept() ;
//下载的线程
// MyDownload download = new MyDownload(socket) ;
// //Runnable->Thread
// Thread downLoadThread = new Thread(download);
// downLoadThread.start();
//这句等于上面几句
new Thread(new MyDownload(socket)).start();
}
}
}
MyDownload
在上一篇中,使用简单的字符串进行了简单的沟通,但是这次是文件,并不存于内存当中,而是存在于磁盘,因此在进行文件传输的时候,需要把文件通过读取文件的输入流放入内存中。
package socket2;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
//处理下载的线程
public class MyDownload implements Runnable{
private Socket socket ;
public MyDownload(Socket socket) {
this.socket = socket ;
}
@Override
public void run() {//线程要做什么事! -下载
try {
System.out.println("与客户端连接成功!");
//服务端向客户端发送消息 Output
OutputStream out = socket.getOutputStream() ;
File file = new File("E:\\msdia80.dll");
//将此文件 从硬盘 读入到内存
InputStream fileIn = new FileInputStream(file) ;
byte[] fileBytes = new byte[1000] ; //定义 每次发送的文件大小
int len = -1 ;
//发送(因为 文件较大,不能一次发送完毕,因此需要通过循环来 分次发送)
while( (len=fileIn.read(fileBytes)) !=-1 ) {
out.write(fileBytes,0,len);
}
fileIn.close();
out.close();
socket.close();
}catch(Exception e) {
e.printStackTrace();
}
}
}
客户端
接收的是文件,因此需要输出流把接收到的文件切片放回磁盘。
输入流读取,输出流写回磁盘
package socket2;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class MyClient {
public static void main(String[] args) throws UnknownHostException, IOException {
//客户端 连接Server发布的服务
Socket socket = new Socket("192.168.1.254",9999);//此ip地址是另一台的电脑的ip地址
//接受服务端发送的消息 InputStream
InputStream in = socket.getInputStream() ;
byte[] bs = new byte[1000] ;//接受每次发来的文件切片(100byte)
int len = -1 ;
OutputStream fileOut = new FileOutputStream("e:\\a.dll") ;
while( (len =in.read(bs))!=-1 ) {
fileOut.write(bs,0,len);
}
System.out.println("下载成功!");
fileOut.close();
// out.close();
in.close();
socket.close();
}
}
现在尽管,服务端和客户端处于两台电脑,也能通过代码运行进行文件传输了。
最后附上文件复制代码
package socket2;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Scanner;
public class CopyFile {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int date = 0;
System.out.print("请输入您要拷贝的源文件:");
String file1 = input.next();
System.out.print("请输入您要拷贝的目标位置:");
String file2 = input.next();
try {
FileInputStream fis = new FileInputStream(file1);
FileOutputStream fos = new FileOutputStream(file2);
while ((date = fis.read()) != -1) {// 读取文件
fos.write(date);
}
fis.close();
fos.close();
System.out.println("拷贝成功!");
} catch (FileNotFoundException e) {
System.out.println("源文件未找到!");
} catch (IOException ex) {
System.out.println(ex.toString());
}
}
}