package com.itheima.demo02.FileUpload;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
/*
文件上传案例的客户端: 读取本地文件, 上传到服务器, 读取服务器回写的数据
明确:
数据源:c:\\1.jpg
目的地: 服务器
实现步骤:
1. 创建一个本地字节输入流 FileInputStream 对象, 构造方法中绑定要读取的数据源
2. 创建一个客户端 Socket 对象, 构造方法中绑定服务器的 IP 地址和端口号
3. 使用 Socket 中的方法 getOutputStream, 获取网络字节输出流 OutputStream 对象
4. 使用本地字节输入流 FileInputStream 对象中的方法 read, 读取本地文件
5. 使用网络字节输出流 OutputStream 对象中的方法 write, 把读取到的文件上传到服务器
6. 使用 Socket 中的方法 getInputStream, 获取网络字节输入流 InputStream 对象
7. 使用网络字节输入流 InputStream 对象中的方法 read 读取服务回写的数据
8. 释放资源 (FileInputStream,Socket)
*/
public class TCPClient {
public static void main(String[] args) throws IOException {
//1. 创建一个本地字节输入流 FileInputStream 对象, 构造方法中绑定要读取的数据源
FileInputStream fis = new FileInputStream("c:\\1.jpg");
//2. 创建一个客户端 Socket 对象, 构造方法中绑定服务器的 IP 地址和端口号
Socket socket = new Socket("127.0.0.1",8888);
//3. 使用 Socket 中的方法 getOutputStream, 获取网络字节输出流 OutputStream 对象
OutputStream os = socket.getOutputStream();
//4. 使用本地字节输入流 FileInputStream 对象中的方法 read, 读取本地文件
int len = 0;
byte[] bytes = new byte[1024];
while((len = fis.read(bytes))!=-1){
//5. 使用网络字节输出流 OutputStream 对象中的方法 write, 把读取到的文件上传到服务器
os.write(bytes,0,len);
}
/*
解决: 上传完文件, 给服务器写一个结束标记
void shutdownOutput() 禁用此套接字的输出流。对于 TCP 套接字,任何以前写入的数据都将被发送,并且后跟 TCP 的正常连接终止序列。*/
socket.shutdownOutput();
//6. 使用 Socket 中的方法 getInputStream, 获取网络字节输入流 InputStream 对象
InputStream is = socket.getInputStream();
System.out.println("333333333333333333333");
//7. 使用网络字节输入流 InputStream 对象中的方法 read 读取服务回写的数据
while((len = is.read(bytes))!=-1){System.out.println(new String(bytes,0,len));
}
System.out.println("444444444444444444 while 死循环打印不到");
//8. 释放资源 (FileInputStream,Socket)
fis.close();
socket.close();}
}
package com.itheima.demo02.FileUpload;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
/*
文件上传案例服务器端: 读取客户端上传的文件, 保存到服务器的硬盘, 给客户端回写 "上传成功"
明确:
数据源: 客户端上传的文件
目的地: 服务器的硬盘 d:\\upload\\1.jpg
实现步骤:
1. 创建一个服务器 ServerSocket 对象, 和系统要指定的端口号
2. 使用 ServerSocket 对象中的方法 accept, 获取到请求的客户端 Socket 对象
3. 使用 Socket 对象中的方法 getInputStream, 获取到网络字节输入流 InputStream 对象
4. 判断 d:\\upload 文件夹是否存在, 不存在则创建
5. 创建一个本地字节输出流 FileOutputStream 对象, 构造方法中绑定要输出的目的地
6. 使用网络字节输入流 InputStream 对象中的方法 read, 读取客户端上传的文件
7. 使用本地字节输出流 FileOutputStream 对象中的方法 write, 把读取到的文件保存到服务器的硬盘上
8. 使用 Socket 对象中的方法 getOutputStream, 获取到网络字节输出流 OutputStream 对象
9. 使用网络字节输出流 OutputStream 对象中的方法 write, 给客户端回写 "上传成功"
10. 释放资源 (FileOutputStream,Socket,ServerSocket)
*/
public class TCPServer {
public static void main(String[] args) throws IOException {
//1. 创建一个服务器 ServerSocket 对象, 和系统要指定的端口号
ServerSocket server = new ServerSocket(8888);
//2. 使用 ServerSocket 对象中的方法 accept, 获取到请求的客户端 Socket 对象
Socket socket = server.accept();
//3. 使用 Socket 对象中的方法 getInputStream, 获取到网络字节输入流 InputStream 对象
InputStream is = socket.getInputStream();
//4. 判断 d:\\upload 文件夹是否存在, 不存在则创建
File file = new File("d:\\upload");
if(!file.exists()){file.mkdirs();
}
//5. 创建一个本地字节输出流 FileOutputStream 对象, 构造方法中绑定要输出的目的地
FileOutputStream fos = new FileOutputStream(file+"\\1.jpg");
//6. 使用网络字节输入流 InputStream 对象中的方法 read, 读取客户端上传的文件
System.out.println("11111111111111111111");
int len =0;
byte[] bytes = new byte[1024];
while((len = is.read(bytes))!=-1){
//7. 使用本地字节输出流 FileOutputStream 对象中的方法 write, 把读取到的文件保存到服务器的硬盘上
fos.write(bytes,0,len);
}
System.out.println("22222222222222222222222 while 死循环打印不到");
//8. 使用 Socket 对象中的方法 getOutputStream, 获取到网络字节输出流 OutputStream 对象
//9. 使用网络字节输出流 OutputStream 对象中的方法 write, 给客户端回写 "上传成功"
socket.getOutputStream().write("上传成功".getBytes());
//10. 释放资源 (FileOutputStream,Socket,ServerSocket)
fos.close();
socket.close();
server.close();}
}
不会走到 2222 或者 44 因为 read 后一直阻塞状态