`

socket-server-http

 
阅读更多

目标:实现一个http协议的demo服务器

实现:启动一个ServerSocket,监听特定端口,然后浏览器请求,返回页面

 

代码实现:

package com.socket.bio.socket;

import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * @author xinchun.wang
 */
public class HttpServer {

	private static final int PORT = 9111;

	public static void main(String[] args) {
		System.out.println("服务器启动...\n");
		HttpServer server = new HttpServer();
		server.init();
	}

	public void init() {
		try {
			ServerSocket serverSocket = new ServerSocket(PORT);
			while (true) {
				// 一旦有堵塞, 则表示服务器与客户端获得了连接
				Socket client = serverSocket.accept();
				// 处理这次连接
				new HandlerThread(client);
			}
		} catch (Exception e) {
			System.out.println("服务器异常: " + e.getMessage());
		}
	}

	private class HandlerThread implements Runnable {
		private Socket socket;

		public HandlerThread(Socket client) {
			socket = client;
			new Thread(this).start();
		}

		public void run() {
			try {
				// 读取客户端数据
				byte[] data = new byte[1024*2];
				InputStream input = socket.getInputStream();
				int  ret = input.read(data);// 这里要注意和客户端输出流的写方法对应,否则会抛
				System.out.println("客户端发过来的内容:" + new String(data));

				while (ret>1024*2) {
					System.out.println("客户端发过来的内容:" + new String(data));
					ret = input.read(data);
				}

				if(!new String(data).contains("GET")){
					input.close();
					socket.close();
					return;
				}
				// 向客户端回复信息
				OutputStream out = socket.getOutputStream();
				// 发送键盘输入的一行
				
				StringBuilder result = new StringBuilder();
				result.append("HTTP/1.1 200 OK");
				result.append("\r\n");
				result.append("Server: Apache-Coyote/1.1");
				result.append("\r\n");
				result.append("Set-Cookie: JSESSIONID=613C816BEC2DB87DB7A043574B68AA57; Path=/");
				result.append("\r\n");
				result.append("Content-Type: text/html;charset=ISO-8859-1");
				result.append("\r\n");
				result.append("Content-Length: 293");
				result.append("\r\n");
				result.append("Date: Tue, 25 Apr 2017 02:58:49 GMT");
				result.append("\r\n");
				result.append("Connection: close");
				result.append("\r\n");
				
				//非常重要,换行下面是response的数据信息
				//如果没有下面这个换行,浏览器无法识别http的response报文
				result.append("\r\n");
				
				//数据body部分,也即浏览器上显示的东西
				result.append("<html>");
				result.append("hello world");
				result.append("</html>");
				System.out.println(result);
				out.write(result.toString().getBytes());

				out.close();
				input.close();
			} catch (Exception e) {
				System.out.println("服务器 run 异常: " + e.getMessage());
			} finally {
				if (socket != null) {
					try {
						socket.close();
					} catch (Exception e) {
						socket = null;
						System.out.println("服务端 finally 异常:" + e.getMessage());
					}
				}
			}
		}
	}
}

服务器端输出http请求的报文和返回的报文:

客户端发过来:
GET /index.html HTTP/1.1
Accept: application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, */*
Accept-Language: zh-CN
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Win64; x64; Trident/4.0; .NET CLR 2.0.50727; SLCC2; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; InfoPath.3)
UA-CPU: AMD64
Accept-Encoding: gzip, deflate
Host: 127.0.0.1:9111
Connection: Keep-Alive
Cookie: JSESSIONID=613C816BEC2DB87DB7A043574B68AA57

返回的报文:
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Set-Cookie: JSESSIONID=613C816BEC2DB87DB7A043574B68AA57; Path=/
Content-Type: text/html;charset=ISO-8859-1
Content-Length: 293
Date: Tue, 25 Apr 2017 02:58:49 GMT
Connection: close
<html>hello world</html>

  

 

 浏览器请求效果:

 

 

  • 大小: 19.9 KB
分享到:
评论

相关推荐

    socket-io-server:提供用于初始化和连接到socket.io服务器的简单抽象

    套接字服务器。 提供用于初始化并连接到socket.io服务器的简单抽象。 此模块创建一个单例对象,该对象公开使用现有的http服务器对象...// Initialize socket server.socket . init ( server ) ;// Initialize http ser

    extended-socket-server_class.zip_WORKING

    4. **协议支持**:除了基础的TCP/IP,Extended Socket Server可能支持其他协议,如HTTP、FTP或自定义协议,提供更丰富的功能。 5. **安全性增强**:通过整合SSL/TLS等加密技术,提供安全的数据传输,保护用户隐私和...

    socket.io-server-cpp.tar.gz

    Socket.IO 支持多种传输机制,包括 WebSocket,HTTP long-polling 等,以确保在各种网络条件下都能保持连接的稳定性。 在给定的压缩包 "socket.io-server-cpp.tar.gz" 中,我们找到了 Socket.IO 的 C++ 实现。这个...

    perl-HTTP-Server-Simple

    Perl-HTTP-Server-Simple是Perl编程语言中的一个轻量级Web服务器模块,它使得在Perl环境中快速搭建本地HTTP服务器变得简单易行。这个扩展包主要用于开发和测试用途,允许开发者在无需复杂配置的情况下,快速启动一个...

    web-socket-js.zip

    因此,对于新的项目,开发者可能需要考虑使用其他技术,如Server-Sent Events (SSE) 或者基于HTTP/2的Push技术来实现实时通信,这些技术在现代浏览器中有更好的支持且不需要Flash。 总的来说,"web-socket-js.zip...

    koa-socket-2:Koa的Socket.IO

    Koa-socket-2 用于将socket.io连接到Koa实例的糖Koa-socket-2使用...安装npm i -S koa-socket-2HTTP示例请让世界变得更美好,并停止使用不安全的渠道。 但是,如果绝对必须这样做,那么以下内容将帮助您入门。 const K

    SNESt-Socket-server

    SNESt-Socket-server是一个基于JavaScript的WebSocket服务器API,它允许开发者构建高性能、低延迟的实时应用。WebSocket是一种在客户端和服务器之间建立长期连接的协议,支持双向通信,即服务器和客户端都可以主动...

    socket-io-server-node

    socket.emit('response', 'Server received your message!'); }); // 当客户端断开连接时 socket.on('disconnect', () =&gt; { console.log('Client disconnected'); }); }); ``` 在这个例子中,我们定义了一个...

    mysql-community-server-5.7.28-x86.tar.gz

    perl-HTTP-Tiny-0.033-3.el7.noarch.rpm perl-libs-5.16.3-294.el7_6.x86_64.rpm perl-macros-5.16.3-294.el7_6.x86_64.rpm perl-parent-0.225-244.el7.noarch.rpm perl-PathTools-3.40-5.el7.x86_64.rpm perl-Pod-...

    C-Web-Server源码 经典的C语言web服务器

    C-Web-Server使用socket API进行网络编程,包括socket创建、bind、listen和accept等函数。这部分代码展示了如何建立服务器与客户端之间的TCP连接。 2. **HTTP协议解析**:接收到客户端的请求后,服务器需要解析HTTP...

    HPSocket--UDP传输客户端应用实例

    首先,HPSocket是一款强大的网络通信组件,它提供了丰富的接口,支持多种协议(如TCP、UDP、HTTP等),并且具有高性能和易用性的特点。在本实例中,HPSocket被用作UDP客户端,用于接收服务器发送的数据。 UDP(User...

    socket-io代码--Android和Server

    Socket socket = IO.socket("http://your-server-url:3000"); socket.connect(); socket.on("connect", new Emitter.Listener() { @Override public void call(Object... args) { Log.d("Socket", "Connected to...

    otm-socket-server

    "otm-socket-server"项目是一个基于JavaScript的网络通信服务器,专门用于实现Socket通信。Socket是一种网络编程中的接口,允许程序通过Internet进行双向通信。在本项目中,它被用作创建实时、低延迟的客户端-服务器...

    smart-http 是一款可编程的 Http 应用微内核,基于smart-socket实现的轻量级http服务器

    smart-http 是一款可编程的 Http 应用微内核,基于smart-socket实现的轻量级http服务器,方便用户根据自身需求进行 Server 或 Client 的应用开发。支持GET、POST的 HTTP 请求。提供了 URL 路由组件,可以快速搭建...

    flutter-socket-server:快速乐队名称服务

    【标题】"flutter-socket-server:快速乐队名称服务"是一个基于Flutter和Socket.IO技术构建的实时通信服务项目,主要用于在移动应用中实现快速查询和管理乐队名称。Flutter是Google推出的一种用于开发iOS和Android...

    C-Web-Server-master 一个很不错的用c实现的web server

    1. **网络编程基础**:C-Web-Server使用了C语言的socket编程接口,这是在操作系统层面进行网络通信的基础。socket API允许程序创建套接字,绑定到特定端口,监听连接,并处理客户端的请求。 2. **HTTP协议理解**:...

    Android下socket模拟http server

    Log.e("HttpServer", "Error creating server socket", e); } ``` 当有客户端连接时,`accept()`方法会阻塞直到有新的连接请求到达。然后,我们可以通过返回的`Socket`对象与客户端进行通信: ```java Socket ...

    nacos-server-1.2.0.zip

    proxy_pass http://nacos-server; } } 4、启动集群, 写个脚本批量启动 startup_all.bat, 脚本代码如下 start startup.cmd -m -i 192.168.1.2 -p 8848 start startup.cmd -m -i 192.168.1.2 -p 8849 ...

    socket -- io 小例子

    const socket = io('http://localhost:3000'); // 连接到服务器 socket.on('connect', () =&gt; { console.log('已连接到服务器:', socket.id); }); socket.on('message', (data) =&gt; { console.log('接收到...

    socket-2.0.3资源包

    var socket = io('http://yourserver.com'); socket.on('connect', function () { console.log('已连接'); socket.emit('my event', { data: 'Hello Server!' }); }); socket.on('my response', function ...

Global site tag (gtag.js) - Google Analytics