day28(集合排序自定义类型元素、自定义比较规则、WebServer项目:V1,V2)

day28(集合排序自定义类型元素、自定义比较规则、WebServer项目:V1,V2)

1.集合排序自定义类型元素

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;
  }
   @Override
   public void run() {
       //读取客户端发过来的消息
       try {
           InputStream in= socket.getInputStream();
           int d;
           while ((d=in.read())!=-1){
               System.out.print((char)d);
          }
      } catch (IOException e) {
           e.printStackTrace();
      }
  }


}

3.版本改动

HTTP协议要求浏览器连接服务端后应当发送一个请求,因此本版本实现读取请求并输出到控制台来了解请求
的格式和内容。

实现:
由于服务端可以同时接收多客户端的连接,因此与聊天室相同,主线程仅负责接受客户端的连接,一旦一个
客户端连接后则启动一个线程来处理。
1:在com.webserver.core下新建类:ClientHandler(实现Runnable接口),作为线程任务。
 工作是负责与连接的客户端进行HTTP交互
2:WebServerApplication主线程接收连接后启动线程执行ClientHandler这个任务处理客户端交互
3:在ClientHandler中读取客户端发送过来的内容(请求内容)并打桩输出

 

 

posted @ 2022-04-08 08:39  约拿小叶  阅读(87)  评论(0)    收藏  举报