分析
- 【客户端】输入流,从硬盘读取文件数据到程序中。
- 【客户端】输出流,写出文件数据到服务端。
- 【服务端】输入流,读取文件数据到服务端程序。
- 【服务端】输出流,写出文件数据到服务器硬盘中。
- 【服务端】获取输出流,回写数据。
- 【客户端】获取输入流,解析回写数据。
客户端
// 1.创建Socket对象,指定要连接的服务器的ip地址和端口号
// 2.创建字节输入流对象,关联数据源文件路径
// 3.通过Socket对象获得字节输出流对象
// 4.定义一个byte数组,用来存储读取到的字节数据
// 4.定义一个int变量,用来存储读取到的字节个数
// 5.循环读取字节数据
// 6.在循环中,写出字节数据
// 告诉服务器,客户端不会再写数据到连接通道中
// 7.通过Socket获得字节输入流对象
// 8.读取服务器回写的数据
// 9.释放资源
服务端
// 服务端:
// 1.创建ServerSocket对象,指定服务器的端口号
// 循环请求
// 2.调用accept方法接收请求,建立连接,得到Socket对象
// 开启线程处理上传文件的任务
// 3.通过Socket对象获得字节输入流
// 4.创建字节输出流对象,关联目的地文件路径
// 5.定义一个byte数组,用来存储读取到的字节数据
// 5.定义一个int变量,用来存储读取到的字节个数
// 6.循环读取字节数据
// 7.在循环中,写出字节数据
// -在文件上传时,客户端从文件中读不到数据,就会停止发送。
// 但是服务器端不知道客户端停止了,所以会一直等待接收数据。
// 解决办法:在客户端调用socket.shutdownOutput();通知服务器端发送结束了。
// 8.通过Socket获得字节输出流对象
客户端代码
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class Client {
public static void main(String[] args) throws Exception {
// 客户端:
// 1.创建Socket对象,指定要连接的服务器的ip地址和端口号
Socket socket = new Socket("127.0.0.1", 6666);
// 2.创建字节输入流对象,关联数据源文件路径
FileInputStream fis = new FileInputStream("文件路径");
// 3.通过Socket对象获得字节输出流对象
OutputStream os = socket.getOutputStream();
// 4.定义一个byte数组,用来存储读取到的字节数据
byte[] bys = new byte[8192];
// 4.定义一个int变量,用来存储读取到的字节个数
int len;
// 5.循环读取字节数据
while ((len = fis.read(bys)) != -1) {
// 6.在循环中,写出字节数据
os.write(bys, 0, len); // -1
}
// 告诉服务器,客户端不会再写数据到连接通道中
socket.shutdownOutput();
System.out.println("=====开始接收服务器回写的数据=====");
// 7.通过Socket获得字节输入流对象
InputStream is = socket.getInputStream();
// 8.读取服务器回写的数据
int len1 = is.read(bys);// 卡
System.out.println(new String(bys,0,len1));
// 9.释放资源
os.close();
fis.close();
}
}
服务端代码
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class Server {
public static void main(String[] args) throws Exception {
// 1.创建ServerSocket对象,指定服务器端口号
ServerSocket ss = new ServerSocket(6666);
// 2.调用accept()方法接收客户端请求,建立连接,返回Socket对象(没有连接成功会一直阻塞)
Socket socket = ss.accept();
while (true) {
// 3.通过返回Socket对象获得字节输入流
InputStream is = socket.getInputStream();
// 4.读取客户端写过来的字符串数据
byte[] bys = new byte[8192];
int len = is.read(bys);
// 5.打印输出
System.out.println("客户端发送过来的数据:" + new String(bys, 0, len));
// 6.通过返回Socket对象获得字节输出流
OutputStream os = socket.getOutputStream();
// 7.写出字符串数据
Scanner sc = new Scanner(System.in);
System.out.println("请输入要对客户端说的悄悄话:");
String msg = sc.next();
os.write(msg.getBytes());
}
// 8.释放资源
// socket.close();
// ss.close();
}
}