上传(客户端示例代码)
package com.qfedu.days08_06.upload;
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
public class UploadTCPFileCilent {
public static void main(String[] args) throws Exception {
//客户端连接服务端
Socket socket = new Socket(InetAddress.getLocalHost(), 8888);
String filePath = "f:\\gs.jpg";
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(filePath));
//bytes就是filePath对应的字节数组
byte[] bytes = StreamUtils.streamToByteArray(bis);
//通过socket获取到输出流,将bytes的数据发送到服务器
BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
bos.write(bytes);//将文件对应的字节数组,写入到数据通道
bis.close();
socket.shutdownOutput();//设置写入数据的结束标记
//接收从服务端回复的信息
InputStream inputStream = socket.getInputStream();
String s = StreamUtils.streamToString(inputStream);
System.out.println(s);
//关闭流
inputStream.close();
bos.close();
socket.close();
}
}
上传(服务器示例代码)
package com.qfedu.days08_06.upload;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class UploadTCPFileServer {
public static void main(String[] args) throws Exception {
//设定一个端口8888
ServerSocket serverSocket = new ServerSocket(8888);
System.out.println("服务器在端口8888进行监听...");
//等待连接
Socket socket = serverSocket.accept();
//读取客户端发送的数据,通过Socket得到输入流
BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());
byte[] bytes = StreamUtils.streamToByteArray(bis);
//将得到的bytes,放入到一个指定的路径,将会得到一个文件
String destPath = "f:\\book.jpg";
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destPath));
bos.write(bytes);
bos.close();
//向客户端回复与"已收到信息",通过socket获得输出流(字符)
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
bw.write("收到图片");
bw.flush();
socket.shutdownOutput();//设置写入结束标记
//关闭其他资源
bw.close();
bis.close();
socket.close();
serverSocket.close();
}
}
(读写流的工具包,使用上传与下载时,调用此包StreamUtils即可,作用是减少代码量)
package com.qfedu.days08_06.upload;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
/**
* 此类用于演示关于流的读写方法
*
*/
public class StreamUtils {
/**
* 功能:将输入流转换成byte[], 即可以把文件的内容读入到byte[]
* @param is
* @return
* @throws Exception
*/
public static byte[] streamToByteArray(InputStream is) throws Exception{
ByteArrayOutputStream bos = new ByteArrayOutputStream();//创建输出流对象
byte[] b = new byte[1024];//字节数组
int len;
while((len=is.read(b))!=-1){//循环读取
bos.write(b, 0, len);//把读取到的数据,写入bos
}
byte[] array = bos.toByteArray();//然后将bos 转成字节数组
bos.close();
return array;
}
/**
* 功能:将InputStream转换成String
* @param is
* @return
* @throws Exception
*/
public static String streamToString(InputStream is) throws Exception{
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
StringBuilder builder= new StringBuilder();
String line;
while((line=reader.readLine())!=null){
builder.append(line+"\r\n");
}
return builder.toString();
}
}
下载(客户端)
package com.qfedu.days08_06.download;
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
public class Client_ {
public static void main(String[] args) throws Exception {
//1.接收用户输入,指定下载的文件名
Scanner scanner = new Scanner(System.in);
System.out.println("请输入需要下载的文件名:");
String downFileName = scanner.next();
//2.客户端连接服务器,准备发送
Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
//3.获取和Socket相关联的输出流
OutputStream outputStream = socket.getOutputStream();
outputStream.write(downFileName.getBytes());
//4.设置写入结束的标志
socket.shutdownOutput();
//5.读取服务端返回的数据(字节数据)
BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());
byte[] bytes = StreamUtils.streamToByteArray(bis);
//6.得到一个输出流,将bytes写入磁盘中
String filePath = "e:\\"+downFileName+".mp4";
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(filePath));
bos.write(bytes);
//7.关闭流
bis.close();
bos.close();
outputStream.close();
socket.close();
System.out.println("客户端下载完毕");
}
}
下载(服务端)
package com.qfedu.days08_06.download;
import com.sun.corba.se.spi.activation.Server;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class Server_{
public static void main(String[] args) throws Exception {
//监听9999端口,
System.out.println("服务端在9999端口正在监听...");
ServerSocket serverSocket = new ServerSocket(9999);
//等待客户端连接,
Socket socket = serverSocket.accept();
//读取客户端发送要下载的文件
InputStream inputStream = socket.getInputStream();
byte[] bytes = new byte[1024];
int len = 0;
String downLoadFileName = "";
while((len = inputStream.read(bytes))!=-1){
downLoadFileName+=new String(bytes,0,len);
}
System.out.println("客户端需要下载的名字:"+downLoadFileName);
String resFileName = "";
if("arts".equals(downLoadFileName)){
resFileName = "f:\\arts.mp4";
}else {
resFileName = "f:\\class.mp4";
}
//创建一个输入流,用于读取文件
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(resFileName));
//使用StreamUtils,读取文件到到一个字节数组
byte[] bytes1 = StreamUtils.streamToByteArray(bis);
//得到Socket关联的输出流
BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
//写入数据,返回到数据通道
bos.write(bytes1);
socket.shutdownOutput();
//关闭流
bis.close();
// bos.close();
inputStream.close();
socket.close();
serverSocket.close();
System.out.println("服务端退出");
}
}