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 即可



  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
使用Java利用socket通信可以实现Modbus-RTU通信协议实现空调对接。Modbus-RTU是一种常用的串行通信协议,可以实现设备之间的数据传输。 首先,需要在Java使用socket实现网络通信。通过创建服务器端socket和客户端socket,可以建立通信连接。服务器端socket监听指定端口,等待客户端的连接请求,客户端socket则主动发起连接请求。 然后,根据Modbus-RTU通信协议,需要实现相应的功能码来进行数据的读取和写入。常用的功能码包括读功能码(0x03)和写功能码(0x06)。通过Java的输入输出流,可以向设备发送相应的Modbus-RTU命令,然后读取或写入数据。 在空调对接的过程,需要调用空调设备的相关API来实现具体的操作。首先需要对空调进行初始化配置,如设置波特率、数据位、停止位等参数。然后可以通过发送读功能码来获取空调的状态信息,如温度、湿度等。通过发送写功能码,可以实现对空调进行控制,如调节温度、开关机等。 需要注意的是,Modbus-RTU通信协议是基于串行通信的,而Javasocket通信是基于网络通信的,两者之间存在差异。因此,在进行空调对接时,需要将串行通信转换为网络通信,将串行口转换为网络socket,并进行相应的协议转换和数据处理。 综上所述,利用Javasocket通信可以实现Modbus-RTU通信协议,实现空调对接。通过实现相应的功能码和调用空调设备的API,可以实现空调的读取和控制操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值