学习目标
1:文件上传案例
2:模拟B/S服务器
学习内容
一:文件上传案例
[客户端]输入流,从硬盘读取文件数据到程序中。
[客户端] 输出流,写出文件数据到服务端。
[服务端]输入流,读取文件数据到服务端程序。
[服务端]输出流,写出文件数据到服务器硬盘中。
实现步骤:
1、创建一个本地字节收入流FileInputStream 对象,构造方法中绑定读取数据的数据源。
2、创建一个socket 对象,构造方法中绑定服务器的IP地址和端口号。
3、使用socket中的方法getoutputstream 获取网络字节输出流。
4、使用本地字节输入流中的read方法,把读取的文件上传到服务器。
5、使用网络输出流中的write方法,读取本地文件。
6、使用socket 中方法,获取输入流对象
7、通过网络输入流对象中的read 方法,读取回写数据
8、释放资源
例如:
服务器
package Demo01FileUpload;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class TcpServer {
public static void main(String[] args) throws IOException {
//1、创建一个服务器的serversocket 对象
ServerSocket server = new ServerSocket(2221);
//2、等待客户端连接
Socket socket = server.accept();
//3、获取输入流
InputStream is = socket.getInputStream();
//4、
File file = new File("E:\\0601");
if(!file.exists()){
file.mkdirs();
}
FileOutputStream fos = new FileOutputStream(file+"\\1.jpg");
int len = 0;
byte[] bytes = new byte[1024];
while((len = is.read(bytes)) != -1){
fos.write(bytes, 0, len);
}
socket.getOutputStream().write("图片上传成功".getBytes());
fos.close();
socket.close();
server.close();
}
}
客户端
package Demo01FileUpload;
/**
* 实现步骤
* 创建一个本地字节输入流FileInputStream对象,构造方法中绑定读取的数据源
* 2创建一个socket对象,构造方法中绑定 服务器的IP地址和端口号
* 3使用过socket中的方法,获取网络字节输出流
* 4使用本地字节输入流中的read方法,获取本地文件
* 5使用网络输出流中的write方法,把读取到的文件上传到服务器
* 6使用socket中的方法,获取输入流对象
* 7通过网络输入流对象中的热爱的反复,读取回写数据**/
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
/*
实现步骤:
1、创建一个本地字节输入流 fileinputSteam 对象,构造方法中绑定读取的数据源
2、创建一个socket对象,构造方法中绑定服务器的IP地址和端口号
3、使用socket中的方法 getoutputstream 获取网络字节输出流
4、使用本地字节输入流中的read方法,读取本地文件
5、使用网络输出流write方法,把读取到的文件上传到服务器
6、使用socket中方法,获取输入流对象
7、通过网络输入流对象中的read方法,读取回写数据
8、释放资源
*/
public class TcpClient {
public static void main(String[] args) throws IOException {
//1、创建一个本地字节输入流 fileinputSteam 对象,构造方法中绑定读取的数据源
FileInputStream fis = new FileInputStream("C:\\Users\\admin\\Pictures\\Saved Pictures\\1.jpg");
//2、创建一个socket对象,构造方法中绑定服务器的IP地址和端口号
Socket socket = new Socket("127.0.0.1",2221);
// 3、使用socket中的方法 getoutputstream 获取网络字节输出流
OutputStream os = socket.getOutputStream();
int len = 0;
byte[] bytes = new byte[1002];
//4、使用本地字节输入流中的read方法,读取本地文件
//5、使用网络输出流write方法,把读取到的文件上传到服务器
while ((len = fis.read(bytes)) != -1) {
os.write(bytes,0,len);
}
//告诉服务器,文件已经发送完毕
socket.shutdownOutput();
//获取网络输入流
InputStream is = socket.getInputStream();
// 7、通过网络输入流对象中的read方法,读取回写数据
while ((len = is.read(bytes)) != -1){
System.out.println(new String(bytes,0,len));
}
//释放资源
fis.close();
socket.close();
}
}
结果为:
文件上传优化
(1)自定义一个文件的命名规则
(2)让服务器一直处于监听状态(死循环accept方法)
(3) 使用多线程技术,提高程序的效率
(4)重写run方法
优化实现
例如:
package Demo02FileUpload;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Random;
public class TcpServer {
public static void main(String[] args) throws IOException {
//1、创建一个服务器的serversocket 对象
ServerSocket server = new ServerSocket(8880);
while (true) {
//2、等待客户端连接
Socket socket = server.accept();
new Thread(new Runnable() {
public void run() {
try {
//3、获取输入流
InputStream is = socket.getInputStream();
File file = new File("E:\\0601");
if (!file.exists()) {
file.mkdirs();
}
String fileName = "classFive" + System.currentTimeMillis() + new Random().nextInt(99999) + ".jpg";
FileOutputStream fos = new FileOutputStream(file + "\\" + fileName);
int len = 0;
byte[] bytes = new byte[1024];
while ((len = is.read(bytes)) != -1) {
fos.write(bytes, 0, len);
}
socket.getOutputStream().write("图片上传成功".getBytes());
fos.close();
socket.close();
} catch (IOException e) {
System.out.println(e);
}
}
}).start();
}
}
}
package Demo02FileUpload;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
/*
实现步骤:
1、创建一个本地字节输入流 fileinputSteam 对象,构造方法中绑定读取的数据源
2、创建一个socket对象,构造方法中绑定服务器的IP地址和端口号
3、使用socket中的方法 getoutputstream 获取网络字节输出流
4、使用本地字节输入流中的read方法,读取本地文件
5、使用网络输出流write方法,把读取到的文件上传到服务器
6、使用socket中方法,获取输入流对象
7、通过网络输入流对象中的read方法,读取回写数据
8、释放资源
*/
public class TcpClient {
public static void main(String[] args) throws IOException {
//1、创建一个本地字节输入流 fileinputSteam 对象,构造方法中绑定读取的数据源
FileInputStream fis = new FileInputStream("C:\\Users\\admin\\Pictures\\Saved Pictures\\1.jpg");
//2、创建一个socket对象,构造方法中绑定服务器的IP地址和端口号
Socket socket = new Socket("127.0.0.1",8880);
// 3、使用socket中的方法 getoutputstream 获取网络字节输出流
OutputStream os = socket.getOutputStream();
int len = 0;
byte[] bytes = new byte[1002];
//4、使用本地字节输入流中的read方法,读取本地文件
//5、使用网络输出流write方法,把读取到的文件上传到服务器
while ((len = fis.read(bytes)) != -1) {
os.write(bytes,0,len);
}
//告诉服务器,文件已经发送完毕
socket.shutdownOutput();
//获取网络输入流
InputStream is = socket.getInputStream();
// 7、通过网络输入流对象中的read方法,读取回写数据
while ((len = is.read(bytes)) != -1){
System.out.println(new String(bytes,0,len));
}
//释放资源
fis.close();
socket.close();
}
}
结果为:
二:模拟B/S服务器
案例分析
准备网页数据,web文件夹
模拟服务端,ServerSocket 类监听窗口,使用浏览器访问
例如:
package Demo03BS;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class TcpServer {
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(8865);
Socket socket = server.accept();
InputStream is = socket.getInputStream();
byte[] bytes = new byte[1024];
int len = 0 ;
// while ((len = is.read(bytes)) != -10){
// System.out.println(new String(bytes,0,len));
// }
BufferedReader br =new BufferedReader(new InputStreamReader(is));
// GET / web HTTP/1.1
String line =br.readLine();
String[] arr = line.split(" ");
String htmlpath = arr[1];
FileInputStream fis = new FileInputStream(System.getProperty("user.dir")+htmlpath);
OutputStream os= socket .getOutputStream();
os.write("HTTP/1.1 200 OK\r\n".getBytes());
os.write("Content-Type:text/html\r\n".getBytes());
os.write("\r\n".getBytes());
while ((len = fis.read(bytes)) != -1){
os.write(bytes,0,len);
}
fis.close();
socket.close();
server.close();
}
}
package Demo03BS;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class TcpServerThread {
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(8898);
while (true) {
Socket socket = server.accept();
new Thread(new Runnable() {
@Override
public void run() {
try {
InputStream is = socket.getInputStream();
byte[] bytes = new byte[1024];
int len = 0;
// while ((len = is.read(bytes)) != -10){
// System.out.println(new String(bytes,0,len));
// }
BufferedReader br = new BufferedReader(new InputStreamReader(is));
// GET / web HTTP/1.1
String line = br.readLine();
System.out.println(line);
String[] arr = line.split(" file:///C:/Users/admin/Desktop/pinyougou/index.html");
String htmlpath = arr[1];
FileInputStream fis = new FileInputStream(System.getProperty("user.dir") + htmlpath);
OutputStream os = socket.getOutputStream();
os.write("HTTP/1.1 200 OK\r\n".getBytes());
os.write("Content-Type:text/html\r\n".getBytes());
os.write("\r\n".getBytes());
while ((len = fis.read(bytes)) != -1) {
os.write(bytes, 0, len);
}
fis.close();
socket.close();
}catch(IOException e){
System.out.println(e);
}
}
}).start();
}
}
}
2020080605041