Erlo

手写Javaweb服务器

2020-10-25 21:30:15 发布   324 浏览  
页面报错/反馈
收藏 点赞

简单web服务器

回忆socket

创建客服端(在httpClient_1包下)

public class Client {
   public static void main(String[] args) {
       //1.创建socket对象
       Socket client=null;

       DataOutputStream dos = null;
       DataInputStream dis =null;
       try {
           client = new Socket("localhost", 8888);
           //2.获取输出流请求
           dos = new DataOutputStream(client.getOutputStream());
           dos.writeUTF("我是客服端:服务器你好!");
           //3.获取输出流响应
           dis = new DataInputStream(client.getInputStream());
           System.out.println(dis.readUTF());
      } catch (IOException e) {
           e.printStackTrace();
      } finally {
           //4.关闭流
           IOClose.closeAll(dis,dos,client);
      }


  }

创建IOClose类

public class IOClose {
   //关闭全部的工具类
   public static void closeAll(Closeable...c){
       for (Closeable closeable : c) {
           if (closeable!=null){
               try {
                   closeable.close();
              } catch (IOException e) {
                   e.printStackTrace();
              }
          }
      }

创建服务端(在httpserver_1包下)

package com.feng.server;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
   public static void main(String[] args) {
       //1.创建ServerSocket对象
       ServerSocket server = null;
       Socket client =null;
       DataInputStream dis =null;
       DataOutputStream dos =null;
       try {
           server = new ServerSocket(8888);
           //2.监听是否有客服端发送请求
           client = server.accept();
           //3.获取Socket对象
           //4.获取输入流 ->得到客服端的请求
           dis = new DataInputStream(client.getInputStream());
           System.out.println(dis.readUTF());
           //5.获取输出流 ->给客服端响应结果
           dos = new DataOutputStream(client.getOutputStream());
           dos.writeUTF("客服端你好,我是服务器,我接受到了你的信息");
      } catch (IOException e) {
           e.printStackTrace();
      } finally {
           IOClose.closeAll(dos,dis,client,server);
      }

同样创建IOClose

在CS结构server(2)

package com.feng.server;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class Server2 {
   public static void main(String[] args) {
       //1.创建ServerSocket对象
       ServerSocket server = null;
       Socket client =null;

       BufferedReader br = null;
       try {
           server = new ServerSocket(8888);
           //2.监听是否有客服端发送请求
           client = server.accept();
           //获取来自浏览器的请求信息
           br = new BufferedReader(new InputStreamReader(client.getInputStream(), "utf-8"));
           String str=null;
           while ((str=br.readLine()).length()>0) {
               System.out.println(str);
          }
      } catch (IOException e) {
           e.printStackTrace();
      } finally {
           IOClose.closeAll(br,client,server);
      }
  }
}

创建HTML


html lang="en">
head>
   meta charset="UTF-8">
   title>javaWebtitle>
head>
body>
   h1>HelloWorldh1>
   form action="http://localhost:8888/index.html" method="post">
       p>用户名:input type="text" id="uname" name="username">p>
       p>密码:input type="password" id="pwd" name="password">p>
       p>input type="submit" value="登入"/>p>
   form>
body>
html>

创建server3

获取来自浏览器的请求信息

//获取来自浏览器的请求信息
is = client.getInputStream();
byte[] buf = new byte[20480];
int len = is.read(buf);
System.out.println(new String(buf,0,len));

对web浏览器做出响应

添加参数

String CRLF="rn";
String BLANK=" ";
InputStream is = null;
/**对web浏览器做出响应*/
StringBuilder sb = new StringBuilder();
StringBuilder sbContent = new StringBuilder(); //响应的文本
sbContent.append("响应结果");
sbContent.append("登入成功");

//1拼接响应头
sb.append("HTTP/1.1").append(BLANK).append(200).append(BLANK).append("OK");
sb.append(CRLF);
sb.append("Content-Type: text/html;charset=UTF-8");
sb.append(CRLF);
sb.append("Content-Length:").append(sbContent.toString().getBytes().length).append(CRLF);
sb.append(CRLF);//带表响应头与响应正文部分之间的换行
sb.append(sbContent);
//2通过输出流
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(client.getOutputStream(),"UTF-8"));
bw.write(sb.toString());
bw.flush();
bw.close();

整合server3

public class Server3 {
   public static void main(String[] args) {
       //1.创建ServerSocket对象
       ServerSocket server = null;
       Socket client =null;
       String CRLF="rn";
       String BLANK=" ";
       InputStream is = null;
       try {
           server = new ServerSocket(8888);
           //2.监听是否有客服端发送请求
           client = server.accept();
           //获取来自浏览器的请求信息
           is = client.getInputStream();
           byte[] buf = new byte[20480];
           int len = is.read(buf);
           System.out.println(new String(buf,0,len));
           /**对web浏览器做出响应*/
           StringBuilder sb = new StringBuilder();
           StringBuilder sbContent = new StringBuilder(); //响应的文本
           sbContent.append("响应结果");
           sbContent.append("登入成功");

           //1拼接响应头
           sb.append("HTTP/1.1").append(BLANK).append(200).append(BLANK).append("OK");
           sb.append(CRLF);
           sb.append("Content-Type: text/html;charset=UTF-8");
           sb.append(CRLF);
           sb.append("Content-Length:").append(sbContent.toString().getBytes().length).append(CRLF);
           sb.append(CRLF);//带表响应头与响应正文部分之间的换行
           sb.append(sbContent);
           //2通过输出流
           BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(client.getOutputStream(),"UTF-8"));
           bw.write(sb.toString());
           bw.flush();
           bw.close();
      } catch (IOException e) {
           e.printStackTrace();
      } finally {
           //6.关闭流
           IOClose.closeAll(is,client,server);
      }


  }
}

手写服务器 整体架构,编写XML文件

创建Request,Response,Server,WebApp(在server包下)

创建Servlet,LoginServlet(在servlet包下)

创建IOCloseUtil(在util包下)

创建web.xml(在WEB_INFO包下)

version="1.0" encoding="UTF-8"?>
web-app >
   servlet>
       servlet-name>loginservlet-name>
       servlet-class>com.feng.servlet.LoginServletservlet-class>
   servlet>
   servlet-mapping>
       servlet-name>loginservlet-name>
       url-pattern>/loginurl-pattern>
   servlet-mapping>
   servlet-mapping>
       servlet-name>loginservlet-name>
       url-pattern>/logurl-pattern>
   servlet-mapping>

web-app>

创建Entity,Mapping,ServletContext,WebDom4j,创建IOClose在util包下

配置解析XML文件

补充实体类

package com.feng.server;

public class Entity {  //servlet-name或每一个servlet-name所对应得实体类
   private String name;
   private String clazz;

   public Entity() {
  }

   public Entity(String name, String clazz) {
       this.name = name;
       this.clazz = clazz;
  }

   public String getName() {
       return name;
  }

   public void setName(String name) {
       this.name
登录查看全部

参与评论

评论留言

还没有评论留言,赶紧来抢楼吧~~

手机查看

返回顶部

给这篇文章打个标签吧~

棒极了 糟糕透顶 好文章 PHP JAVA JS 小程序 Python SEO MySql 确认