`

JAVA中利用socket实现HTTP请求

 
阅读更多

一个基于java的web服务器实现主要使用这两个重要的类:java.net.Socket和java.net.ServerSocket,并通过HTTP消息进行通信。

HTTP请求

一个HTTP请求包括三个组成部分:

1.方法—统一资源标示符(URI)—协议/版本

2.请求的头部

3.主体内容

GET / HTTP/1.1
Host: 127.0.0.1:8080
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36
Accept-Encoding: gzip,deflate,sdch
Accept-Language: zh-CN,zh;q=0.8

HTTP响应

类似于HTTP请求,一个HTTP响应也包括三个组成部分:

1.方法-统一资源标示符(URI)-协议/版本

2.响应的头部

3.主体内容

下面是一个HTTP响应的例子:

HTTP/1.1 200 OK  
Server: IBM/4.0  
Date: Sat, 6 Nov 2013 13:13:00 GMT  
Content-Type: text/html  
Last-Modified: Sat, 5 Jan 2013 13:13:12 GMT  
Content-Length: 112  

socket类

套接字是网络连接的一个端点。套接字使得一个应用可以从网络中读取和写入数据。放在两个不同的计算机上的两个应用可以通过连接发送和接受字节流。为了从你的应用发送一条信息到另一个应用,你需要指导另一个应用的IP地址和套接字端口。

ServerSocket类

Socket类代表一个客户端套接字,即任何时候你想连接到一个远程服务器应用的时候你构造的套接字。如果是一个服务器程序依靠Socket类是行不通的。你的服务器必须随时待命,因为客户端何时想你发送请求是不知道的。

ServerSocket和Socket不同,服务器套接字的角色是等待来自客户端的连接请求。一旦服务器套接字获得一个连接请求,它创建一个Socket实例来与客户端进行通信。

下面是一个简单的HTTP请求的实现:

先创建一个HTTPSERVER服务

public class HttpServer {
    public static final String WEB_ROOT =  "d:/webroot";

    private static final String SHUTDOWN_COMMAND = "/SHUTDOWN";

    private boolean shutdown = false;

    public static void main(String[] args) {
        HttpServer server = new HttpServer();
        server.await();
    }

    public void await() {

        ServerSocket serverSocket = null;

        int port = 8080;

        try {
            serverSocket = new ServerSocket(port, 1, InetAddress
                    .getByName("127.0.0.1"));
        } catch (UnknownHostException e) {

            e.printStackTrace();

        } catch (IOException e) {

            e.printStackTrace();
            System.exit(1);

        }

        // Loop waiting for a request
        while (!shutdown) {

            Socket socket = null;
            InputStream input = null;
            OutputStream output = null;

            try {
                socket = serverSocket.accept();
                input = socket.getInputStream();
                output = socket.getOutputStream();

                // create Request object and parse
                Request request = new Request(input);
                request.parse();

                // create Response object
                Response response = new Response(output);
                response.setRequest(request);
                response.sendStaticResource();

                // Close the socket;
                socket.close();

                // check if the revious URI is a shutdown command
                shutdown = request.getUri().equals(SHUTDOWN_COMMAND);
            } catch (IOException e) {

                e.printStackTrace();
                continue;

            }

        }

    }
}

对应服务要有请求

public class Request {
    private InputStream input;

    private String uri;

    public Request(InputStream input) {
        this.input = input;
    }

    public void parse() {
        // Read a set of characters from the socket
        StringBuffer request = new StringBuffer(2018);

        int i;
        byte[] buffer = new byte[2048];

        try {
            i = input.read(buffer);
        } catch (IOException e) {
            e.printStackTrace();
            i = -1;
        }

        for (int j = 0; j < i; j ++) {
            request.append((char)buffer[j]);
        }

        System.out.println("-----------------request----------------");
        System.out.print(request.toString());

        uri = parseUri(request.toString());
    }

    private String parseUri(String requestString) {

        int index1, index2;
        index1 = requestString.indexOf(' ');
        if (index1 != -1) {
            index2 = requestString.indexOf(' ', index1 + 1);
            return requestString.substring(index1 + 1, index2);
        }
        return null;

    }

    public String getUri() {

        return uri;
    }
}

对应请求要有响应

public class Response {

    private static final int BUFFER_SIZE = 1024;

    private Request request;
    private OutputStream output;

    public Response(OutputStream output) {
        this.output = output;
    }

    public void setRequest(Request request) {
        this.request = request;
    }

    public void sendStaticResource() throws IOException {
        byte[] bytes = new byte[BUFFER_SIZE];
        FileInputStream fis = null;
        boolean errorFlag = true;
        if(request.getUri()!=null){
            File file = new File(HttpServer.WEB_ROOT, request.getUri());
            if (file.exists()) {
                fis = new FileInputStream(file);
                int ch = fis.read(bytes, 0, BUFFER_SIZE);
                while (ch != -1) {
                    output.write(bytes, 0, ch);
                    ch = fis.read(bytes, 0, BUFFER_SIZE);
                }
                errorFlag = false;
            }
        }
        if(errorFlag) {
            // file not found
            String errorMessage = "HTTP/1.1 404 File NOT Fount\r\n" +
                    "Content-Type: text/html\r\n" +
                    "Content-Length: 23\r\n" +
                    "\r\n" +
                    "<h1>File Not Found</h1>";
            output.write(errorMessage.getBytes());
        }
        if (fis != null) {
            fis.close();
        }
    }
}

以上三个简单的类创建好后,我们可以启动HttpServer,然后在浏览器上输入127.0.0.1:8080 可以看见一个File Not Found,如果想有结果输出到页面上,请配置一个文件在webroot下,例如建一个order.txt,在里面写些内容,也可以弄一个html,这样就可以在页面上显示你所要看的页面,请求方式就是http://127.0.0.1:8080/order.txt

若想关闭此服务则调用http://127.0.0.1:8080/SHUTDOWN 即可



分享到:
评论

相关推荐

    利用java socket实现发送http请求

    基于java socket发送http请求。这种原生的发送请求的方式能适合一些特定场景,比如: A向B发送请求,A不考虑B是否处理成功,即A不关注B的响应结果,那么A就不用阻塞等B的回应。 传统的Httpclient请求方式都是阻塞...

    JAVA文件传输的实现.rar

    Socket编程:利用Java的Socket API实现客户端和服务器之间的通信,建立TCP连接进行数据传输。 文件流操作:使用Java的文件输入输出流(FileInputStream、FileOutputStream)读取和写入文件内容。 多线程处理:通过多...

    java实现简单实现C/S应用

    利用Socket编程实现C/S应用。其中,Client端为GUI程序,用于提供界面输入两个数,并有1个“发送”按钮,另外还有一个 TextField用于显示传来的计算结果;Server端用于监听连接请求、计算发送过来的两数的和、送回...

    一个简单的JAVA即时通讯软件 -- 利用Socket的TCP通信编程 计算机网络实验

    本程序主要实现两方面功能: 1 聊天:两方可互相发送文本消息 并显示在界面上 2 发送文件:一方请求发送文件 对方可拒绝 也可接收 如果拒绝 则不传输文件 如果接收 则将所选择的文件发送给对方 "&gt;计算机网络实验 本...

    java源码包---java 源码 大量 实例

    Java利用DES私钥对称加密代码实例 同上 java聊天室 2个目标文件,简单。 java模拟掷骰子2个 1个目标文件,输出演示。 java凭图游戏 一个目标文件,简单。 java求一个整数的因子 如题。 Java生成密钥的实例 1个...

    基于JAVA的聊天系统的设计与实现

    在网络编程中对信息的读取、发送,是利用流来实现信息的交换,其中介绍了对实现一个系统的信息流的分析,包含了一些基本的软件工程的方法。经过分析这些情况,该局域网聊天工具采用Eclipse为基本开发环境和java语言...

    java源码包2

    Java利用DES私钥对称加密代码实例 同上 java聊天室 2个目标文件,简单。 java模拟掷骰子2个 1个目标文件,输出演示。 java凭图游戏 一个目标文件,简单。 java求一个整数的因子 如题。 Java生成密钥的实例...

    基于Java的视频会议系统(软件程序+WORD论文文档).zip

    利用Socket类的方法,就可以实现两台计算机之间的通讯。在Java中Socket可以理解为客户端或者服务器端的一个特殊的对象,这个对象有两个关键的方法,一个是getInputStream方法,另一个是getOutputStream方法。...

    java源码包4

    Java利用DES私钥对称加密代码实例 同上 java聊天室 2个目标文件,简单。 java模拟掷骰子2个 1个目标文件,输出演示。 java凭图游戏 一个目标文件,简单。 java求一个整数的因子 如题。 Java生成密钥的实例...

    java源码包3

    Java利用DES私钥对称加密代码实例 同上 java聊天室 2个目标文件,简单。 java模拟掷骰子2个 1个目标文件,输出演示。 java凭图游戏 一个目标文件,简单。 java求一个整数的因子 如题。 Java生成密钥的实例...

    基于JAVA的WEB服务器与图形化浏览器

    java实现模拟tomcat服务器,利用socket接手请求,resquest和respose处理请求发送响应,编写了Servlet接口,用户需要在web.xml配置全类名和URL,编写servlet实现类就可以使用,客户端浏览器,使用java的Swing组件,...

    JAVA上百实例源码以及开源项目源代码

    Java利用DES私钥对称加密代码实例 同上 java聊天室 2个目标文件,简单。 java模拟掷骰子2个 1个目标文件,输出演示。 java凭图游戏 一个目标文件,简单。 java求一个整数的因子 如题。 Java生成密钥的实例 1个...

    JAVA上百实例源码以及开源项目

    Java利用DES私钥对称加密代码实例 同上 java聊天室 2个目标文件,简单。 java模拟掷骰子2个 1个目标文件,输出演示。 java凭图游戏 一个目标文件,简单。 java求一个整数的因子 如题。 Java生成密钥的实例 1个...

    基于JAVA CS远程监控系统软件的实现(源代码+WORD论文文档论文).zip

    本系统是利用类java.awt.robot中的屏幕截取和鼠标、键盘自动控制功能,然后加上网络传输功能来完成来完成截屏和远程控制的。 2.2.2 系统运行概述 1.启动被监控端,打开指定的UDP端口号。用于读取命令。 2.被监控端...

    实验三Socket通信实验报告.doc

    1.1利用Socket来接收信息 TcpListener tlListen1 = new TcpListener ( 8889 ) ; //侦听端口号 tlListen1.Start ( ) ; Socket skSocket = tlListen1.AcceptSocket ( ) ; //接受远程计算机的连接请求,并获得用以接收...

    3个简单java课程设计

    晕有个带密码两个好使的

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    将其解码,李四用张三的公钥加密信息,并发送给李四,张三用自己的私钥解密从李四处收到的信息…… Java利用DES私钥对称加密代码实例 同上 java聊天室 2个目标文件,简单。 java模拟掷骰子2个 1个目标文件,输出演示...

    深入Java Servlet网络编程

    第13章 在Java Servlet中利用 RMI 13. 1 RMI概述 13. 2 RMI的实现 13. 2. 1 定义远程接口 13. 2. 2 实现远程对象 13. 2. 3 将远程对象绑定到RMI的名称空间 13. 2. 4 作为客户对象的Servlet 13. 2. 5 运行RMI...

    基于Java实现的Web服务器与测试工具开发.zip

    基于Java编程语言,利用http socket通信技术,写一个小型的web服务器与一个爬虫的测试工具,来对比分析所写的服务器获取到的页面源码与从tomcat获取的相似度。 (1)小型web服务器: 1)支持客户端的网页请求,进行...

    Socket编程实验报告.docx

    然后利用Socket类提供的方法创建Socket对象的输入流和输出流。此后即于客户端进行通信,直到客户端断开连接即关闭各个流结束通信。 代码如下: import java.net.*; import java.io.*; class aa { static public void...

Global site tag (gtag.js) - Google Analytics