原文地址:http://www.ihuxu.com/p/235.html
首先了解下HTTP协议:
wikiPedia的说明很好,在此不重复了。链接:http://zh.wikipedia.org/wiki/Http
源码分析:
概述:此两个代码段,完成服务器监听,线程处理短请求服务和应答(符合伪HTTP协议,“伪”即判断协议格式不严谨)。展示了利用java socket完成http通信的核心原理代码,希望给初次学习socket或者第一次利用java来实现HTTP协议服务器的朋友提供些帮助。
利用 Java Socket 网络编程来绑定服务器某个端口进行监听。
- package JHServer;
- import java.io.IOException;
- import java.net.ServerSocket;
- import java.net.Socket;
- public class Server {
- private static int PORT = 1720;
- public static String charset = "utf-8";
- private ServerSocket ss;
- private Socket client;
- public static void main(String[] args) {
- new Server();
- }
- public Server() {
- try {
- this.ss = new ServerSocket(this.PORT);
- System.out.println("Server Listening Port " + this.PORT + "...");
- boolean isGo = true;
- while(isGo){
- this.client = this.ss.accept();
- System.out.println("One Client Connected. " + this.client);
- ClientThread ct = new ClientThread(this.client);
- Thread t = new Thread(ct);
- t.start();
- System.out.println("One Client Thread Already Started...");
- }
- } catch (IOException e) {
- e.printStackTrace();
- } finally {
- try{
- if(this.ss != null){
- this.ss.close();
- this.ss = null;
- }
- if(this.client != null){
- this.client.close();
- this.client = null;
- }
- } catch(IOException e) {
- e.printStackTrace();
- }
- }
- }
- }
说明:上述代码完成了服务端口(1720,你懂么)的监听,并同时利用线程了处理每个客户端(Client )的消息请求,以减少服务器处理”短请求“阻塞问题。
下述代码完成请求是否符合伪HTTP协议,并完成响应消息。
- package JHServer;
- import java.io.*;
- import java.net.Socket;
- import java.util.Date;
- import action.ManagerEachMatchInfo;
- import view.*;
- public class ClientThread implements Runnable {
- private float requestDelay = (float)0.5;//
- private Socket _s;
- private BufferedReader i;
- private PrintStream o;
- public ClientThread(Socket s) {
- this._s = s;
- }
- public void run() {
- try {
- this.i = new BufferedReader(new InputStreamReader(this._s.getInputStream()));
- this.o = new PrintStream(this._s.getOutputStream());
- String request = this.getValidRequest();
- if( !request.equals("") ) {
- System.out.print("当前虚拟机最大可用内存为:");
- System.out.println(Runtime.getRuntime().maxMemory()/1024/1024+"M");
- System.out.print("当前,虚拟机已占用内存:");
- System.out.println(Runtime.getRuntime().totalMemory()/1024/1024+"M");
- this.o.println("HTTP/1.1 200 OK");
- Date now = new Date();
- this.o.println("Data:" + now);
- this.o.println("Server: JHServer");
- this.o.println("Access-Control-Allow-Origin:*");
- this.o.println("Content-Type: text/html; charset=UTF-8");
- this.o.println();
- String content = null;
- IndeMatchInfo imi = new IndeMatchInfo(22,22,2,2,22,(double)0.0,"S7-200");
- content = imi.getHTML();
- imi.clear();
- imi = null;
- System.out.print("当前虚拟机最大可用内存为:");
- System.out.println(Runtime.getRuntime().maxMemory()/1024/1024+"M");
- System.out.print("当前,虚拟机已占用内存:");
- System.out.println(Runtime.getRuntime().totalMemory()/1024/1024+"M");
- this.o.println(content);
- content = "";
- this.o.flush();
- }
- } catch (IOException e) {
- e.printStackTrace();
- } finally {
- this.close();
- }
- }
- private String getValidRequest() {
- float second = (float) 0.0;
- boolean isGo = true;
- String request = null;
- try {
- while (!this.i.ready()) {
- second += 0.01;
- if (second > this.requestDelay) {
- System.out.println("One Client Delayed " + this._s);
- isGo = false;
- break;
- }
- Thread.sleep(10);
- }
- if (isGo == true) {
- request = this.i.readLine();
- if( request.contains("GET /") && request.contains(" HTTP/") ) {
- request = request.substring(request.indexOf("/"),request.indexOf(" HTTP/"));
- System.out.println("Client Request Info: " + request);
- } else {
- isGo = false;
- }
- }
- } catch (InterruptedException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- } finally {
- if(isGo == true) {
- return request;
- } else {
- return "null";
- }
- }
- }
- private void close() {
- try {
- if (this.i != null) {
- this.i.close();
- this.i = null;
- }
- if (this.o != null) {
- this.o.close();
- this.o = null;
- }
- if (this._s != null) {
- this._s.close();
- this._s = null;
- }
- System.out.println("One Client Disconnected...");
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
说明:
1、getValidRequest() 验证请求消息是否满足伪HTTP协议。比如:GET /images/logo.gif HTTP/1.1,则会返回"/images/logo.gif"。若不符合伪HTTP协议或者请求时不发送任何消息头(比如通过telnet访问,此情况最大延迟0.5秒),则会返回空串。
2、close(),释放内存,同时线程结束。
3、run(),短请求的线程主体,在此处可以进行数据逻辑处理,并返回特定消息内容。
相关推荐
在这个场景中,我们讨论的是如何使用Java的Socket来实现文件上传功能,即从客户端将文件发送到服务器,然后保存到服务器的数据库中。这个过程涉及到多个关键知识点,下面我们将详细探讨。 1. **Java Socket基础**:...
Java Socket实现简单的Web服务器是一个基础但实用的编程实践,它涉及到网络编程、HTTP协议和文件I/O等核心概念。在本项目中,我们利用Java的Socket API构建了一个基本的服务器,该服务器仅处理HTTP GET请求并返回...
Java Socket服务器客户端程序是网络编程中的基础组件,用于实现两台计算机之间的通信。Socket编程是Java提供的一个标准接口,它允许应用程序通过网络发送和接收数据。在这个程序中,我们将探讨以下几个核心知识点: ...
在Java中,Socket类和ServerSocket类是进行网络通信的核心工具,它们提供了客户端与服务器之间的连接和通信机制。 在"Java Socket PC端传输文件简易服务器客户端"这个项目中,我们主要会涉及以下知识点: 1. **...
在Java编程语言中,使用Socket实现一个简单的HTTP服务器是一项基础但重要的技能。HTTP服务器是互联网上用于接收HTTP请求并返回响应的程序。本教程将详细解释如何通过Socket类来构建这样的服务器,同时会涉及到相关的...
在Java中,Socket类和ServerSocket类是进行网络通信的核心。ServerSocket用于监听客户端的连接请求,而Socket则代表了服务器与客户端之间的一个连接。 实现多用户连接服务器,我们需要创建一个服务器端应用,它使用...
综上所述,这个Java实现的HTTP服务器项目涵盖了Java网络编程、HTTP协议解析、反射、XML解析和多线程等多个核心知识点,是学习和实践这些技术的良好平台。通过对该项目的深入理解和实践,开发者可以提升在网络编程...
本篇将深入探讨Java Socket在即时通讯服务器开发中的核心概念、步骤以及关键技术。 首先,Java Socket是Java提供的网络编程接口,允许两台机器上的应用程序通过网络进行双向通信。在即时通讯服务器中,Socket扮演着...
Java Socket 开发高并发小型服务器涉及的核心概念是网络编程中的Socket技术,以及如何利用Java语言构建能够处理大量并发连接的服务端。首先,Socket是网络通信中的一个基础概念,它为两台计算机之间的通信提供了接口...
在这个"Java Socket实现的简单聊天室实例"中,我们将探讨如何利用Java的Socket API创建一个简单的多用户聊天室。这个实例包括了服务器端和客户端的代码,帮助初学者深入理解Socket在实际应用中的工作原理。 首先,...
本教程将深入探讨Java Socket编程的核心概念,以及如何利用它进行网络通信。 1. **Java Socket基础** - **Socket的概念**:Socket是网络通信中的一个端点,可以理解为两台机器间通信的桥梁。在Java中,Socket类...
在Java中,Socket类和ServerSocket类是实现客户端-服务器模型通信的核心工具。下面将详细介绍Java Socket编程的基本概念、关键组件、以及如何构建服务端和客户端程序。 一、Socket基本概念 Socket通常被称为“套接...
在IT行业中,网络编程是至关重要的一个领域,而Java Socket编程则是实现客户端与服务器通信的基础。本项目"Java socket聊天软件 服务器和用户分开,可断开重连恢复聊天"是一个典型的实例,它展示了如何使用Java ...
在IT行业中,网络编程是不可或缺的一部分,而Java的Socket编程则是实现网络通信的基础。本项目“用Java Socket实现的一个多人聊天的小软件”就是一个很好的实践案例,它利用了Java的Socket和Thread类,创建了一个...
JavaCV 是一个强大的Java库,它为Java程序员提供了与...以上就是使用JavaCV将通过Socket获取的视频流推送到RTMP服务器涉及的核心技术点。在实际开发中,开发者需要理解这些技术,并结合具体需求进行相应的编程实现。
在本项目中,"简单qq聊天(Java socket实现)"是一个使用Java编程语言构建的简易聊天应用程序,旨在模拟QQ的基本功能。它利用了Socket编程来实现实时的客户端-服务器通信,允许用户进行群聊、私聊以及状态更新。下面...
本文将深入探讨如何使用Java的原生Socket类实现HTTP和HTTPS通信,以此来加深对网络协议的理解。 首先,我们来看HTTP(超文本传输协议),它是互联网上应用最广泛的一种网络协议,用于从Web服务器传输超文本到本地...
在Java中,`java.net.Socket`和`java.net.ServerSocket`类是实现Socket通信的关键。ServerSocket用于监听客户端的连接请求,而Socket则是实际建立连接并进行数据传输的实体。 在这个五子棋游戏中,服务器端(Server...
在本项目中,Socket是核心组件,用于建立客户端和服务器之间的通信链路。以下是对这个项目及其相关知识点的详细说明: 1. **Java Socket编程**: Java Socket API提供了一种在应用程序之间建立网络连接的方法。...
Java Socket是Java编程语言中用于网络通信的核心API,它提供了低级别的、面向连接的、基于TCP/IP协议的网络通信能力。在"Java Socket 视频流转发Socket"这个主题中,我们将深入探讨如何使用Java Socket来处理视频流...