服务器实现处理GET和POST

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.URLDecoder;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class HttpServer {

    public static void doGet(String message,OutputStream op) throws IOException{

        //显示报文
        System.out.println(message);

        Pattern p = Pattern.compile("/?a=(.+) HTTP");

        Matcher page = p.matcher(message);

        String result = "";

        while(page.find()){

            //System.out.println(page.group(1));
            result = page.group(1);

        }

        result = URLDecoder.decode(result, "GBK");

        //关键在于utf-8
        OutputStreamWriter osw = new OutputStreamWriter(op,"utf-8");

        osw.write("HTTP/1.1 200 OK\r\n");
        osw.write("Server: Apache-Coyote/1.1\r\n");
        //osw.write("Set-Cookie: JSESSIONID=03493794995CE31A0F131787B6C6CBB2; Path=/; HttpOnly\r\n");
        osw.write("Content-Type: text/html;charset=UTF-8\r\n");
        osw.write("Transfer-Encoding: chunked\r\n");

        osw.write("Date: Tue, 19 May 2015 02:48:27 GMT\r\n");
        osw.write("\r\n");
        osw.write("c9\r\n");
        osw.write("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\r\n");
        osw.write("<HTML>\r\n");
        osw.write("  <HEAD><TITLE>A Servlet</TITLE></HEAD>\r\n");
        osw.write("  <BODY>\r\n");

        //osw.write("    This is myServ, using the GET method\r\n");
        osw.write("你输入了  : "+result);

        osw.write("  </BODY>\r\n");
        osw.write("</HTML>\r\n");
        osw.write("\r\n");
        //osw.write("0");
        osw.write("\r\n");
        osw.write("\r\n");
        osw.flush();
        osw.close();
        op.flush();
        op.close();

    }

    public static void doPost(String message,OutputStream op,byte [] buf) throws IOException{

        //显示报文
        System.out.println(message);

        //收取数据
        new Thread(new Runnable(){

            @Override
            public void run() {

                Pattern p = Pattern.compile("filename=\"(.+)\"");

                Matcher page = p.matcher(message);

                String filename = "";

                while(page.find()){

                    System.out.println(page.group(1));
                    filename = page.group(1);

                }

                File file = new File("C:\\Users\\binbin\\Desktop\\计网作业\\ReciveFile"+"\\"+filename);
                //if(!file.exists()){

                    try {
                        file.createNewFile();

                        FileOutputStream fop = new FileOutputStream(file);

                        fop.write(buf,556,20);

                        fop.close();

                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }

                //}

            }

        }).start();

        //关键在于utf-8
        OutputStreamWriter osw = new OutputStreamWriter(op,"utf-8");

        osw.write("HTTP/1.1 200 OK\r\n");
        osw.write("Server: Apache-Coyote/1.1\r\n");
        //osw.write("Set-Cookie: JSESSIONID=03493794995CE31A0F131787B6C6CBB2; Path=/; HttpOnly\r\n");
        osw.write("Content-Type: text/html;charset=UTF-8\r\n");
        osw.write("Transfer-Encoding: chunked\r\n");
        osw.write("Date: Tue, 19 May 2015 02:48:27 GMT\r\n");
        osw.write("\r\n");
        osw.write("c9\r\n");
        osw.write("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\r\n");
        osw.write("<HTML>\r\n");
        osw.write("  <HEAD><TITLE>A Servlet</TITLE></HEAD>\r\n");
        osw.write("  <BODY>\r\n");
        osw.write("    Post Method:UpLoad OK!\r\n");
        osw.write("  </BODY>\r\n");
        osw.write("</HTML>\r\n");
        osw.write("\r\n");
        osw.write("\r\n");
        osw.write("\r\n");
        osw.flush();
        osw.close();
        op.flush();
        op.close();

    }

    public static void main(String[] args) throws IOException, InterruptedException {  

        // 服务器监听端口号
        ServerSocket serverSocket = new ServerSocket(8099);  

        //死循环服务器一直运行
        while(true){

        // 等待接收请求,这是一个阻塞的方法,当请求到来的时候才会继续向下执行
        Socket socket = serverSocket.accept(); 

        // 获取请求内容  InputStream
        InputStream is = socket.getInputStream(); 

        Thread.sleep(500);

        // 返回报文 用 OutputStream
        OutputStream out = socket.getOutputStream();

        File file = new File("GetMetho.txt");

        FileOutputStream fop = new FileOutputStream(file);

        //获取报文
        int len = 0;
        byte [] buf = new byte[1024];
        String message = "";
        while((len=is.read(buf))!=-1){

            message += new String(buf,0,len);
            /*
            if(message.contains("favicon.ico")||message.contains("google.com:443"))
                break;
            */
            fop.write(buf,0,len);
            break;

        }

        fop.close();

        //System.out.println(message);

        if(message.contains("favicon.ico")||message.contains("google.com:443"))
            continue;

      //如果是Post
        else if(message.contains("POST")){
            HttpServer.doPost(message,out,buf);
        }

        //如果是Get
        else if(message.contains("GET")){
            //System.out.println(message);
            HttpServer.doGet(message,out);
        }

        else;

        is.close();

       }//end while

    }  

}

GET的html:

<html>
<body>

<form action="http://localhost:8099" method="get">
<input name="a" type="text" value="Hello" />
<input name="" type="submit" value="提交" />
</form>

</body>
</html>

POST的html:

<form action="http://localhost:8099" enctype="MULTIPART/FORM-DATA"

    method="POST">
    <INPUT NAME="userfile1" TYPE="file">
    <input type="submit" value="submit"/>
</form>  

POST其实是水的,因为看书里面获取上传的文件内容那段代码太长了,不想写。。就直接数了一下前面报文有多少字,直接从那后面开始读了。

时间: 2024-08-29 20:46:44

服务器实现处理GET和POST的相关文章

Sqlserver通过链接服务器访问Oracle的解决办法

转自http://blog.sina.com.cn/s/blog_614b6f210100t80r.html 一.创建sqlserver链接服务(sqlserver链接oracle)  首先sqlserver 链接oracle可以通过两个访问接口: “MSDAORA” 和“OraOLEDB.Oracle” 1.“MSDAORA”访问接口是由Microsoft OLE DB Provider for Oracle提供的,这里建议不使用此接口进行链接.通过该访问接口建立的链接服务器在进行查询orac

XShell 连接虚拟机中的服务器 失败 、连接中断(Connection closed by foreign host.)

在使用XShell连接虚拟机中的服务器时,报以下错误并断开连接,之前连接还是挺稳定的,忽然就这样了 Last login: Thu Aug 10 21:28:38 2017 from 192.168.1.102 [[email protected] ~]# Socket error Event: 32 Error: 10053. Connection closing...Socket close. Connection closed by foreign host. Disconnected f

通过SoftEther VPN自建VPN服务器

SoftEther VPN是日本政府的研究和开发项目的一项工作,由日本的经济.贸易和工业部资助,由信息化推进机构管理.SoftEther VPN在日本筑波大学开发的免费软件.具有终极兼容许多设备的高性能VPN.支持Windows.Mac.智能手机.平板电脑(iPhone\iPad\Android\WindowsRT)和思科或其他VPN路由器.SoftEther VPN也接受OpenVPN和MS-SSTP VPN客户端. 可以从http://www.softether-download.com/(

微信开发之本地接口调试(非80端口,无需上传服务器服务器访问

前言: 本文是总结在开发微信接口时,为方便开发所采取的一些快捷步骤,已节省开发人员难度开发时间从而提高开发效率. 本地测试: (提醒,在本地模拟微信get或post数据时先将校验参数注释掉) 利用微信模拟器weixinPost进行模拟发送xml数据 由于这个软件是微信没公开高级接口时公布的,所以对于高级接口的调试,笔者利用的是Fiddler这个抓包工具模拟post数据 高端测试: 利用反向代理软件ngrok访问本地项目: ngrok 是一个反向代理,通过在公共的端点和本地运行的 Web 服务器之

pfsense Web服务器负载平衡配置示例

在pfsense的网关和服务器中有两种类型的负载平衡功能.网关负载平衡可以通过多个WAN连接分发Internet绑定的流量.服务器负载平衡管理传入流量,因此它利用多个内部服务器进行负载分配和冗余,服务器负载平衡允许流量在多个内部服务器之间分配,它最常用于Web服务器和SMTP服务器.下面我们就以实例来介绍服务器负载平衡的设置. 下面介绍如何通过pfsense2.32配置Web服务器的负载平衡. 网络环境 服务器负载平衡示例网络环境 上图为示例网络环境.它由单个防火墙组成,使用其WAN IP地址池

部署AlwaysOn第一步:搭建Windows服务器故障转移集群

在Windows Server 2012 R2 DataCenter 环境中搭建集群之前,首先要对Windows服务器故障转移集群(Windows Server Failover Cluster,简称WSFC)有基本的了解.WSFC必须部署在域管理环境中,由多台服务器组成,每台服务器称作一个"结点"(Node),每个结点上都运行了Windows服务器故障转移集群服务,整个集群系统允许部分结点掉线.故障或损坏而不影响整个系统的正常运作.集群自动检测结点的健康状态,一旦活跃结点发生异常,变

如何将Win7做为NTP服务器

1. 修改注册表项 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer Enabled 设定为 1(默认0) HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config\ AnnounceFlags 设定为 5 (默认 10) Value Meaning 0 Timeserv_Announce_No, R

win7搭建局域网时间服务器

近日,本人想在局域网内通过普通的windows 7 PC搭建一台NTP服务器,可看似简单的配置却给我捣腾了了半天.初期,参考了互联网的上相关的配置文档,可网络设备就是死活不同步NTP服务器的时间.实在没办法,只有通过来抓包分析了,经过一番研究后,终于找到问题,现将这个文档与大家分享: 通过windows系统为局域网搭建NTP服务器,为局域网内网络设备提供时间服务,经过测试,使用于windows xp.windows 2003.windows 7. 1.启用 NTPServer.为此,请按照下列步

C# 远程服务器 安装、卸载 Windows 服务,读取远程注册表,关闭杀掉远程进程

这里安装windows服务我们用sc命令,这里需要远程服务器IP,服务名称.显示名称.描述以及执行文件,安装后需要验证服务是否安装成功,验证方法可以直接调用ServiceController来查询服务,也可以通过远程注册表来查找服务的执行文件:那么卸载文件我们也就用SC命令了,卸载后需要检测是否卸载成功,修改显示名称和描述也用sc命令.至于停止和启动Windows服务我们可以用sc命令也可以用ServiceController的API,当停止失败的时候我们会强制杀掉远程进程,在卸载windows

C# 远程服务器 创建、修改、删除 应用程序池 网站

首先 C# 操作 站点 需要 引用Microsoft.Web.Administration.dll 文件,创建站点我们一般需要 远程服务的IP,网站名称.端口.物理路径:这里默认网站名称和应用程序池名称一致. 应用程序池默认不启动,应为刚创建站点是没有对应真实的物理文件,修改 队列长度.启动模式.回收时间.最大工作进程, 以及日志路径.修改的时候如果修改站点物理路径的话,我们需要把文件 从旧得目录拷贝到新的目录下,删除站点就比较简单了. 但是站点应用程序池的停止 和启动就比较难搞了,不是调用st