day28(集合排序自定义类型元素、自定义比较规则、WebServer项目:V1,V2)
package collection;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
/**
* 集合排序自定义类型元素
*/
public class SortListDemo2 {
public static void main(String[] args) {
List<Point> list = new ArrayList<>();
list.add(new Point(1, 2));
list.add(new Point(15, 8));
list.add(new Point(9, 7));
list.add(new Point(5, 3));
list.add(new Point(4, 6));
System.out.println(list);
/*
编译不通过。原因:集合元素没有实现接口Comparable。只有实现了该接口的类
才可以进行比较(实现接口后就必须重写方法compareTo()用于定义两个元素间的
比较大小规则)。
该操作对我们的代码具有侵入性,不建议这样做。
侵入性:当我们调用一个功能时,其要求我们为其修改其他额外的代码,这就是侵入性
它不利于程序后期的维护与扩展,应当尽量避免。
*/
// Collections.sort(list);
/**匿名内部类
* */
/* Comparator<Point>c=new Comparator<Point>() {
@Override
public int compare(Point o1, Point o2) {
int len1=o1.getX()*o1.getX()+o1.getY()*o1.getY();
int len2=o2.getX()*o2.getX()+o2.getY()*o2.getY();
return len1-len2;
}
};
Collections.sort(list,c);*/
/**没有侵入性的写法*/
/* Collections.sort(list,new Comparator<Point>() {
@Override
public int compare(Point o1, Point o2) {
int len1=o1.getX()*o1.getX()+o1.getY()*o1.getY();
int len2=o2.getX()*o2.getX()+o2.getY()*o2.getY();
return len1-len2;
}
});*/
/**lambda写法
* */
Collections.sort(list, (o1, o2) -> o1.getX() * o1.getX() + o1.getY() * o1.getY() - o2.getX() * o2.getX() - o2.getY() * o2.getY());
System.out.println(list);
}
}
//class MyComparator implements Comparator<Point>{
//
// @Override
// /**
// * 用来定义两个元素o1与o2的大小关系,返回值为:
// * 当返回值>0时:表示o1>o2的
// * 当返回值<0时:表示o1<o2的
// * 当返回值=0时:表示o1=o2
// */
// public int compare(Point o1, Point o2) {//compare:比较
// int len1 = o1.getX()*o1.getX()+o1.getY()* o1.getY();
// int len2 = o2.getX()*o2.getX()+o2.getY()* o2.getY();
// return len1-len2;
// }
//}
2.自定义比较规则
package collection;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
/**
* 当元素本身实现了Comparable接口并定义了比较规则,但是按照该规则排序后不满足我们的排序
* 需求时,我们也可以自定义比较规则。
*/
public class SortListDemo3 {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
// list.add("tom");
// list.add("jerry");
// list.add("jack");
// list.add("rose");
// list.add("jill");
// list.add("ada");
// list.add("Hanmeimei");
// list.add("Lilei");
list.add("苍老师");
list.add("传奇");
list.add("小泽老师");
System.out.println(list);
// Comparator<String> c=new Comparator<String>() {
// @Override
// public int compare(String o1, String o2) {
// return o1.length()-o2.length();
// }
// };
Collections.sort(list, (o1, o2) -> (o2.length() - o1.length()));
System.out.println(list);
}
}
3.WebServer项目
1.V1
1.WebServerApplication
package com.webserver.core;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
/**
* WebServer主类
* WebServer是一个Web容器,实现了Tomcat中的基础功能,通过这个项目的学习了解Tomcat的
* 底层工作逻辑。
* Web容器是一个Web服务端程序,主要负责两方面的工作:
* 1:管理部署在容器中的所有网络应用
* 2:与客户端(通常就是浏览器)进行TCP通讯,并基于HTTP协议进行应用交互,使得客户端可以
* 通过网络远程调用容器下不同网络应用中的内容。
* <p>
* 网络应用(webapp):包含的内容大致有:网页,处理业务的代码,其他资源等。就是俗称的"网站"
*/
public class WebServerApplication {
private ServerSocket serverSocket;
WebServerApplication() {
try {
System.out.println("正在启动服务端...");
serverSocket = new ServerSocket(8088);
System.out.println("服务端启动完毕!");
} catch (IOException e) {
e.printStackTrace();
}
}
public void start() {
try {
System.out.println("等待客户端连接....");
Socket socket=serverSocket.accept();
System.out.println("一个客户端连接了");
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
WebServerApplication application=new WebServerApplication();
application.start();
}
}
2.V2
1.WebServerApplication
package com.webserver.core;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
/**
* WebServer主类
* WebServer是一个Web容器,实现了Tomcat中的基础功能,通过这个项目的学习了解Tomcat的
* 底层工作逻辑。
* Web容器是一个Web服务端程序,主要负责两方面的工作:
* 1:管理部署在容器中的所有网络应用
* 2:与客户端(通常就是浏览器)进行TCP通讯,并基于HTTP协议进行应用交互,使得客户端可以
* 通过网络远程调用容器下不同网络应用中的内容。
* <p>
* 网络应用(webapp):包含的内容大致有:网页,处理业务的代码,其他资源等。就是俗称的"网站"
*/
public class WebServerApplication {
private ServerSocket serverSocket;
WebServerApplication() {
try {
System.out.println("正在启动服务端...");
serverSocket = new ServerSocket(8088);
System.out.println("服务端启动完毕!");
} catch (IOException e) {
e.printStackTrace();
}
}
public void start() {
try {
System.out.println("等待客户端连接....");
Socket socket=serverSocket.accept();
System.out.println("一个客户端连接了");
//启动一个线程处理该客户端的交互
ClientHandler handler=new ClientHandler(socket);
Thread t=new Thread(handler);
t.start();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
WebServerApplication application=new WebServerApplication();
application.start();
}
}
2.ClientHandler
package com.webserver.core;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
/**该线程任务负责与指定客户端完成HTTP交互
* 与客户端的交流分成三步
* 1.解析请求
* 2.处理请求
* 3.发送响应
*
* */
public class ClientHandler implements Runnable{
private Socket socket;
public ClientHandler(Socket socket){
this.socket=socket;
}
3.版本改动
HTTP协议要求浏览器连接服务端后应当发送一个请求,因此本版本实现读取请求并输出到控制台来了解请求
的格式和内容。
实现:
由于服务端可以同时接收多客户端的连接,因此与聊天室相同,主线程仅负责接受客户端的连接,一旦一个
客户端连接后则启动一个线程来处理。
1:在com.webserver.core下新建类:ClientHandler(实现Runnable接口),作为线程任务。
工作是负责与连接的客户端进行HTTP交互
2:WebServerApplication主线程接收连接后启动线程执行ClientHandler这个任务处理客户端交互
3:在ClientHandler中读取客户端发送过来的内容(请求内容)并打桩输出