在实际中,服务器端很少关闭
package com.llb.tcp.服务器优化;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.UUID;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class Server {
public static void main(String[] args) throws IOException {
//循环方式
// whileMethod();
//UUID生成新文件名
// uuidNameMethod();
//用多线程优化 同时处理多个客户端
//以上两种,同一时间,只能有一个服务端访问服务器
// threadMethod();
//用线程池优化
threadPoolMethod();
}
//循环方式
private static void whileMethod() throws IOException {
ServerSocket serverSocket = new ServerSocket(10014);
while (true) {
Socket socket = serverSocket.accept();
InputStream is = socket.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is);
BufferedOutputStream bos =
new BufferedOutputStream(
new FileOutputStream("Day15\\b.png"));
int len;
byte[] bytes = new byte[1024];
while ((len=bis.read(bytes))!=-1){
bos.write(bytes,0,len);
bos.flush();
}
bos.close();
//告诉客户端上传完毕
OutputStream os = socket.getOutputStream();
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
bw.write("上传完毕");
bw.newLine();
bw.flush();
socket.close();
}
// serverSocket.close();
}
//UUID生成新文件名
private static void uuidNameMethod() throws IOException {
ServerSocket serverSocket = new ServerSocket(10014);
while (true) {
Socket socket = serverSocket.accept();
InputStream is = socket.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is);
String uuid =
UUID.randomUUID().toString().replace("-","");
BufferedOutputStream bos =
new BufferedOutputStream(
new FileOutputStream("Day15\\"+uuid+".png"));
int len;
byte[] bytes = new byte[1024];
while ((len=bis.read(bytes))!=-1){
bos.write(bytes,0,len);
bos.flush();
}
bos.close();
//告诉客户端上传完毕
OutputStream os = socket.getOutputStream();
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
bw.write("上传完毕");
bw.newLine();
bw.flush();
socket.close();
}
// serverSocket.close();
}
//用多线程优化 同时处理多个客户端
private static void threadMethod() throws IOException {
ServerSocket serverSocket = new ServerSocket(10014);
while (true) {
//服务器只负责接收客户端的访问,然后把任务交给子线程
//服务端只负责接收客户端请求,子线程负责处理业务
Socket socket = serverSocket.accept();
//通过构造方法传递socket 给ServerThread
ServerThread st = new ServerThread(socket);
Thread thread = new Thread(st);
thread.start();
}
// serverSocket.close();
}
//用线程池优化
private static void threadPoolMethod() throws IOException{
ServerSocket serverSocket = new ServerSocket(10014);
ThreadPoolExecutor pool = new ThreadPoolExecutor(
3, //核心线程数量
10, //最大线程数
60, //空闲线程最大存活时间
TimeUnit.SECONDS, //空闲线程最大存活时间的单位
new ArrayBlockingQueue<Runnable>(5), //任务队列,容量为5
Executors.defaultThreadFactory(), //创建线程的工厂
new ThreadPoolExecutor.AbortPolicy() //拒绝策略
);
while (true) {
//服务器只负责接收客户端的访问,然后把任务交给子线程
//服务端只负责接收客户端请求,子线程负责处理业务
Socket socket = serverSocket.accept();
//通过构造方法传递socket 给ServerThread
ServerThread st = new ServerThread(socket);
pool.submit(st);
}
}
}
package com.llb.tcp.服务器优化;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.UUID;
public class ServerThread implements Runnable {
private Socket socket;
public ServerThread(Socket socket) {
this.socket = socket;
}
public void run() {
BufferedOutputStream bos = null;
try {
InputStream is =
socket.getInputStream();
BufferedInputStream bis =
new BufferedInputStream(is);
String uuid =
UUID.randomUUID().toString().replace("-","");
bos =new BufferedOutputStream(
new FileOutputStream("Day15\\"+uuid+".png"));
int len;
byte[] bytes =
new byte[1024];
while ((len=bis.read(bytes))!=-1){
bos.write(bytes,0,len);
bos.flush();
}
//告诉客户端上传完毕
OutputStream os =
socket.getOutputStream();
BufferedWriter bw =
new BufferedWriter(new OutputStreamWriter(os));
bw.write("上传完毕");
bw.newLine();
bw.flush();
} catch (IOException e) {
e.printStackTrace();
}finally {
if (socket!=null){
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (bos!=null){
try {
bos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
package com.llb.tcp.服务器优化;
import java.io.*;
import java.net.Socket;
public class Client {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("127.0.0.1",10014);
//要上传的文件
BufferedInputStream bis = new BufferedInputStream(
new FileInputStream("Day15\\a.png")
);
//
OutputStream os = socket.getOutputStream();
BufferedOutputStream bos = new BufferedOutputStream(os);
int len;
byte[] bytes = new byte[1024];
while ((len=bis.read(bytes))!=-1){
bos.write(bytes,0,len);
bos.flush();
}
bis.close();
//告诉服务器上传完毕
socket.shutdownOutput();
//获取服务器端上传结果
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String s = br.readLine();
System.out.println(s);
socket.close();
}
}