使用Java实现Web服务器编程

使用 Java 编写一个简单的多线程 TCP 服务器,可以同时处理多个客户端连接 在 run 方法中,我们首先向客户端发送欢迎消息,然后开始循环读取客户端发送的消息,并将其回送给客户端。如果客户端发送了“bye”消息,则退出循环并关闭连接。在上面的代码中,我们定义了一个名为 TCPServer 的类,它使用 Java 的 Socket API 实现了一个简单的多线程 TCP 服务器。服务器监听 9000 端口,并在接收到客户端连接时启动一个新线程处理该连接。如果您同时打开多个客户端连接,您将看到服务器能够同时处理多个连接,并使用不同的线程为每个连接提供服务。 阅读详情

import java.io.*;

import java.net.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.*;

public class WebServer {
    public static void main(String[] args) throws IOException {
        try {
            //connection number
            int i = 1;
            //establish server socket
            ServerSocket s = new ServerSocket(8189);

            while (true) {
                //wait for client connection
                Socket incoming = s.accept();
                System.out.println("WebServer running on port: " + s.getLocalPort());
                System.out.println("The connection number is: " + i);
                Runnable r = new ThreadHandler(incoming);
                Thread t = new Thread(r);
                t.start();
                i++;
            }

        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

/**
 * This class handles the client input for one server socket
 */
class ThreadHandler implements Runnable {
    private Socket incomig;

    public ThreadHandler(Socket i) {
        incomig = i;
    }

    public void run() {
        try {
            try {
                InputStream inStream = incomig.getInputStream();
                OutputStream outStream = incomig.getOutputStream();
                Scanner in = new Scanner(inStream);
                PrintWriter out = new PrintWriter(outStream, true);

                while (true) {
                    String line = in.nextLine();
                    if (line.equals("\r\n") && line.equals("")) {
                        break;
                    }
                    System.out.println("the client request is :" + line);
                    //read request line
                    String[] requests = line.split("\\s+");
                    //read request head
                    Map<String, String> headMap = null;
                    //read request body
                    Map<String, String> parameterMap = null;
                    if (requests[0].equals("GET")) {
                        //response GET request
                        //respense with the file that the request wants
                        String path = System.getProperties().getProperty("user.dir") + requests[1].replaceAll("\\/", "//");
                        System.out.println("The file that the client wants is:" + path);
                        //read request head
                        headMap = readhead(in);
                        //read request body
                        parameterMap = readbody(in);
                        doGet(path, out);

                    } else if (requests[0].equals("POST")) {
                        //response POST request
                        //response with the file that the request wants and write the parameter at the of the file
                        String path = System.getProperties().getProperty("user.dir") + requests[1].replaceAll("\\/", "//");
                        System.out.println("The file that the client wants is:" + path);
                        //read request head
                        headMap = readhead(in);
                        //read request body
                        parameterMap = readbody(in);
                        doPost(path, out, parameterMap);

                    }
                }

            } finally {
                incomig.close();

            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private Map<String, String> readhead(Scanner in) {
        String headline = in.nextLine();
        Map<String, String> headMap = new HashMap<>();
        while (!headline.equals("\r\n") && !headline.equals("")) {
            String[] keyValue = {"", ""};
            String[] temp = headline.split(": |:");
            if (temp.length == 2) {
                keyValue = temp;
            }
            if (temp.length == 1) {
                keyValue[0] = temp[0];
            }
            headMap.put(keyValue[0], keyValue[1]);
            headline = in.nextLine();
        }
        return headMap;
    }

    private Map<String, String> readbody(Scanner in) {
        String bodyline = in.nextLine();
        if (bodyline.equals("\r\n") || bodyline.equals("")) {
            return null;
        }
        String t = in.nextLine();
        while (!t.equals("\r\n") && !t.equals("")) {
            bodyline += t + "\r\n";
            t = in.nextLine();
        }
        String[] parameters = bodyline.split("&");
        Map<String, String> parameterMap = new HashMap<>();
        String[] keyV = {"", ""};
        for (String parameter : parameters) {
            String[] temp = parameter.split("=");
            if (temp.length == 2) {
                keyV = temp;
            }
            if (temp.length == 1) {
                keyV[0] = temp[0];
            }
            parameterMap.put(keyV[0], keyV[1]);
        }
        return parameterMap;
    }

    private void doGet(String requestPath, PrintWriter out) {
        final String CRLF = "\r\n";
        String statusLine = null;
        String date = new Date().toString();
        String contentTypeLine = "";
        String contentLengthLine = "";
        String entityBody = "";

        File requestFile = new File(requestPath);
        Path path = Paths.get(requestPath);
        if (requestFile.exists()) {
            statusLine = "HTTP/1.0 200 OK";
            contentLengthLine = String.valueOf(requestFile.length());
            try {
                contentTypeLine = Files.probeContentType(path);
                List<String> contents = Files.readAllLines(path);
                for (String line : contents) {
                    entityBody += line + CRLF;
                }
            } catch (IOException e) {
                statusLine = "HTTP/1.0 400 BadRequest";
                entityBody = "<HTML>400 Not BadRequest</TITLE></HEAD>" +
                        "<BODY>400 BadRequest" +
                        e.getMessage();
                e.printStackTrace();
            }
        } else {
            statusLine = "HTTP/1.0 404 Not Found";
            entityBody = "<HTML>404 Not Found</TITLE></HEAD>" +
                    "<BODY>404 Not Found";

        }
        out.print(statusLine + CRLF);
        out.print("Date: " + date + CRLF);
        out.print("Content-Type: " + contentTypeLine + CRLF);
        out.print("Content-Length: " + contentLengthLine + CRLF);
        out.print(CRLF);
        out.print(entityBody + CRLF);
        out.flush();
    }

    private void doPost(String requestPath, PrintWriter out, Map<String, String> parameterMap) {
        final String CRLF = "\r\n";
        String statusLine = null;
        String date = new Date().toString();
        String contentTypeLine = "";
        String contentLengthLine = "";
        String entityBody = "";

        File requestFile = new File(requestPath);
        Path path = Paths.get(requestPath);
        if (requestFile.exists()) {
            statusLine = "HTTP/1.0 200 OK";
            try {
                PrintWriter fileWrite = new PrintWriter(new FileWriter(requestFile, true));
                fileWrite.append(parameterMap.toString());
                fileWrite.close();
                contentLengthLine = String.valueOf(requestFile.length());
                contentTypeLine = Files.probeContentType(path);
                List<String> contents = Files.readAllLines(path);
                for (String line : contents) {
                    entityBody += line + CRLF;
                }
            } catch (IOException e) {
                statusLine = "HTTP/1.0 400 BadRequest";
                entityBody = "<HTML>400 Not BadRequest</TITLE></HEAD>" +
                        "<BODY>400 BadRequest" +
                        e.getMessage();
                e.printStackTrace();
            }
        } else {
            statusLine = "HTTP/1.0 404 Not Found";
            entityBody = "<HTML>404 Not Found</TITLE></HEAD>" +
                    "<BODY>404 Not Found";

        }
        out.print(statusLine + CRLF);
        out.print("Date: " + date + CRLF);
        out.print("Content-Type: " + contentTypeLine + CRLF);
        out.print("Content-Length: " + contentLengthLine + CRLF);
        out.print(CRLF);
        out.print(entityBody + CRLF);
        out.flush();
    }

}

Windows平台下使用Java构建Web服务器的实验指南 HTTP(HyperText Transfer Protocol,超文本传输协议)是一种用于分布式、协作式和超媒体信息系统的应用层协议。它通过请求-响应模型在客户端与服务器间传递信息。了解HTTP的基本工作原理,是深入学习Java网络编程和Web服务器开发的前提。网络编程是指编写程序以在计算机网络中进行通信的过程。随着互联网技术的发展,网络编程已成为软件开发中不可或缺的一部分。它使得软件应用能够实现数据传输、资源共享、服务交互等功能,为分布式应用和全球访问提供了基础。 阅读详情

相关推荐

MyWebserver: 利用Java实现简易Web服务器

MyWebServer提供了一些基本的安全模块,例如:访问控制模块:允许管理员定义哪些IP地址或IP范围可以访问服务器资源。密码保护模块:对特定目录设置访问密码,只有提供正确凭证的用户才能访问。日志记录模块:记录所有访问请求和错误信息,用于追踪和审计。在本章节中,我们介绍了网络安全的基础知识、MyWebServer的安全配置以及性能优化策略。通过细致的分析和具体的配置建议,我们能够建立一个更安全、高效的Web服务器环境。

weixin_35266799的博客 1256

Java编写客户/服务端程序【网络编程】

本程序建立在TCP/IP基础上,为应用层的实现。传输层向应用层提供了套接字Socket接口,Socket封装了下层的数据传输细节。应用层的程序通过Socket建立与远程主机的TCP连接和数据传输。

小猫咪的博客 3039

计算机网络实验一 Windows环境下用java实现web服务器

通过本实验,使学生能够进一步理解 HTTP 协议的技术细节以及 WEB 服务器的实现原理

Java后端平台的搭建

注:一定要提前配置好Maven**在 ****在**里面配置 类似于Vue的路由配置 服务器启动配置以为例 在ideal上方的 点击 基本配置 在点击选择文件 把里面的删除掉,保证名字与项目的一致性 运行服务端 点击运行 是你配置的文件

weixin_75111785的博客 846

java语言写的web服务器

欢迎访问我的服务器!这是用JAVA写出的WEB服务器主页

java写的服务端,能够与客户端进行通信

导入java编辑器之后就能通过终端telnet连接,或者与客户端连接

Java服务端HTTP接口开发(各种类型、token、cookie、session)的代码示例

首先在jeecg工程中找到InterfaceEnum所在位置:在包内InterfaceEnum类中的构造方法为,如下图所示,将开发的接口,通过上图的构造方法,声明在InterfaceEnum中。与其他声明在此的接口,以相隔,如下图所示。其中,均为JEECG后台——接口权限管理——的录入/编辑接口权限时设置的“接口权限编码”。InterfaceEnum中构造方法各参数的含义,如下所示。

u010804417的博客 8135

JAVA 编写服务器与客户端

用JAVA编写一个服务器端和客户端,使得客户端可以向服务器端发送数据,服务器端接收数据后把数据打印出来

【Java】服务端与客户端的实现

在Java中编写服务端和客户端程序通常涉及到网络通信,最常见的网络协议是TCP和UDP。这里,将以TCP协议为例,展示如何使用Java的ServerSocket和Socket类来编写一个简单的服务端和客户端程序。

weixin_71491685的博客 1328

用Matlab搞定Delta并联机器人运动学:从建模到正逆解完整流程(附代码)

本文详细介绍了如何使用Matlab实现Delta并联机器人的运动学分析,包括几何建模、正逆解求解及可视化验证。通过符号计算和数值迭代法,解决非线性方程组问题,并提供完整代码示例,帮助读者快速掌握Delta机器人的运动学计算与应用。

weixin_30955617的博客 175

4.无限共轭距柯克物镜设计——zemax学习笔记

无限共轭cooker物镜

fly_daerm的博客 1594

Java写一个简单的Web服务器Socket实现

                    Java写一个简单的Web服务器Socket实现   一、实现思路 1、使用 ServerSocket 监听某一端口,然后等待连接获取 Socket对象。 2、创建一个类 HttpServer 继承 java.lang.Thread 类,重写 run()方法,执行浏览器请求。 3、获得浏览器请求,解析资源文件路径。 4、读取资源文件,响应给浏览器...

HaHa_Sir的博客 2万+

从AD到HFSS:Gerber文件驱动的PCB三维电磁仿真全流程解析

本文详细解析了从AD到HFSS的Gerber文件驱动的PCB三维电磁仿真全流程,重点介绍了Gerber文件作为桥梁的重要性、AD端Gerber文件导出实战指南、HFSS 3D Layout导入技巧及高级问题排查方法。通过实际案例和技巧分享,帮助工程师高效完成PCB电磁仿真,提升设计验证效率。

weixin_33735077的博客 259

用Java实现Web服务器

[b]HTTP协议[/b] 超文本传输协议(HTTP)是位于TCP/IP 协议的应用层,是最广为人知的协议,也是互连网中最核心的协议之一,同样,HTTP 也是基于 C/S 或 B/S 模型实现的。事实上,我们使用的浏览器如Netscape 或IE 是实现HTTP 协议中的客户端,而一些常用的Web 服务器软件如Apache、IIS 和iPlanet Web Server 等是实现HTTP 协议中...

sherryxuehua的专栏 143

【SAP】ABAP——ALV显示后选择数据操作

在ALV显示后,可全选、全不选或者选择几条数据进行发邮件、更新、下单等等操作。 在user_command中的实现方式如下: 方式一: FORM user_command USING ucomm LIKE sy-ucomm selfield TYPE slis_selfield. DATA: lr_grid TYPE REF TO cl_gui_alv_grid. DATA: lt_rows TYPE lvc_t_row WITH

Mona_1220的博客 4090

一、Abaqus CAE 入门操作(薄膜应力计算)

一、Abaqus CAE 入门操作(薄膜应力计算)

A20802013的博客 4365

Java多线程 Web服务器简单实现

import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStreamReader; import jav

rommel1的专栏 1万+

ROS-Industrial :simple_message

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录1. 概述2. 协议(Protocol)3. HEADER解析3.1 MSG_TYPE3.2 COMM_TYPE3.3 REPLY CODE 1. 概述 Simple_Message是ROS-Industrial的一部分,定义了用于与工业机器人控制器通信的简单消息连接协议。另外还包括处理连接受限系统的处理器和管理器类。 2. 协议(Protocol) 简单消息(simplemessage)协议定义了ROS的驱动层和机器人控制器之.

flsxyw的博客 780

java web服务_如何用Java实现Web服务器

展开全部如何用Java实现Web服务器 一、HTTP协议的作用原理WWW是以Internet作为传输媒介的一个应用系e69da5e887aa62616964757a686964616f31333335346138统,WWW网上最基本的传输单位是Web网页。WWW的工作基于客户机/服务器计算模型,由Web 浏览器(客户机)和Web服务器(服务器)构成,两者之间采用超文本传送协议(HTTP)进行通信。...

weixin_33724759的博客 775

X猫免费小说安卓逆向分析

七猫免费小说安卓逆向分析 难度(♥♥) 文章目录七猫免费小说安卓逆向分析 难度(♥♥)1. 查壳2. 抓包分析3. sign1. Frida-rpc2. Native函数分析快3点了. 睡觉~ 白天再继续写! 1. 查壳 我这边使用的是ApkTool, 拖进去显示未加壳。 2. 抓包分析 POST https://xiaoshuo.wtzw.com/api/v1/login/index HTTP/1.1 net-env: 1 channel: qm-cbcpa056_wm is-white: 0 platf

Qiled的博客 4366

RK356x U-Boot研究所(命令篇)3.7 pci与nvme命令的用法

RK356x U-Boot研究所(命令篇)3.7 pci与nvme命令的用法

Systemcall名屋 2084

使用Java实现一个最简单的Web Server

Hello Web ServerWeb Server没有你想象的那么难实现(当然要实现一个好的Java Web Server还是很有难度的)。你只要明白基本的HTTP协议,TCP编程和IO知识。当然,你也要会最简单的HTML代码。我们先来一个屌丝版,这个屌丝版能显示Hello Web Serverpackage exec.network.webserver;import java.io.Buffer

酱油能码丁 2万+

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

java web服务器代码_最后完善的JAVA WEB服务器源代码

--------------------------------------------------------------------------------前言:我写的JAVA2WEBSERVER(代码以前也发表过)功能上已经得到很大改善,虽然实用性不强,目的是想通过这个程序多点了解HTTP协议和作为JAVA编程的入门练习,可以说只是一个WEB服务器的模型。但是已经具备基本的WEB服务器的功能...

weixin_34116482的博客 674

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

java实现网络编程_Java的网络编程:用Java实现Web服务器

超文本传输协议(HTTP)是位于tcp/IP 协议的应用层,是最广为人知的协议,也是互连网中最核心的协议之一,同样,HTTP 也是基于 C/S 或 B/S 模型实现的。事实上,我们使用的浏览器如Netscape 或IE 是实现HTTP 协议中的客户端,而一些常用的web 服务器软件如Apache、IIS 和iPlanet Web Server 等是实现HTTP 协议中的服务器端。Web 页由服务端...

weixin_36477469的博客 540

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

java web四:ServerSocket模拟web服务器

import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; public class Server { public static void main(String[] args) throws Exception{ ServerSocket sever = new ServerSo...

m0_37564426的博客 504

java实现web服务器_java实现web服务器

java实现web服务器首先上代码:1 /**2 *@authorhewenwu3 * 功能:模拟web服务程序4 * 原理:java多线程、socket编程,TCP协议5 */67 import java.io.*;8 import java.net.*;910 public classweb_server{1112 public static voidmain(String args...

weixin_26759093的博客 1192
上一篇: 构建分布式系统技术发展历史
下一篇: 使用Java实现POP客户端编程
不要清汤锅
博客等级 码龄10年 39粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值