Java Socket现实简单的HTTP服务

Java写一个简单的静态文件的HTTP服务器(基于Socket) ** 一、实现思路 ** 1、使用 ServerSocket 监听某一端口,然后等待连接获取 Socket对象。 2、创建一个类 HttpServer 继承 java.lang.Thread 类,重写 run()方法,执行浏览器请求。 3、获得浏览器请求,解析资源文件路径。 4、读取资源文件,响应给浏览器。 ** 二、代码实现 ** 1、ServerSocket 监听端口,获取... 阅读详情

文章原地址:http://jiangzhengjun.iteye.com/blog/512380



一个简单的用 Java Socket 编写的 HTTP 服务器应用, 演示了请求和应答的协议通信内容以及给客户端返回 HTML 文本和二进制数据文件(一个图片), 同时展示了 404, 200 等状态码.

  
首先运行这个程序,然后打开Web浏览器,键入http://localhost,则这个程序能够显示出浏览器发送了那些信息并且向浏览器返回一个网页和一副图片, 并测试同浏览器对话.  当浏览器看到 HTML 中带有图片地址时, 则会发出第二次连接来请求图片等资源.  这个例子可以帮您理解 Java 的 HTTP 服务器软件是基于 J2SE 的 Socket 等软件编写的概念, 并熟悉HTTP 协议.  相反的用 Telnet 连接到已有的服务器则可以帮忙理解浏览器的运行过程和服务器端的返回内容.  
   
当用户在Web浏览器地址栏中输入一个带有http://前缀的URL并按下Enter后,或者在Web页面中某个以http://开头的超链接上单击鼠标,HTTP事务处理的第一个阶段--建立连接阶段就开始了.HTTP的默认端口是80.  随着连接的建立,HTTP就进入了客户向服务器发送请求的阶段.客户向服务器发送的请求是一个有特定格式的ASCII消息,其语法规则为: 


  < Method > < URL > < HTTP Version > <\r\n>  
  { <Header>:<Value> <\r\n>}  
  <\r\n>  
  { Entity Body } 


请求消息的顶端是请求行,用于指定方法,URL和HTTP协议的版本,请求行的最后是回车换行.方法GET,POST,HEAD,PUT,DELETE等.  在请求行之后是若干个报头(Header)行.每个报头行都是由一个报头和一个取值构成的二元对,报头和取值之间以":"分隔;报头行的最后是回车换行.常见的报头有Accept(指定MIME媒体类型),Accept_Charset(响应消息的编码方式),Accept_Encoding(响应消息的字符集),User_Agent(用户的浏览器信息)等.  在请求消息的报头行之后是一个回车换行,表明请求消息的报头部分结束.在这个之后是请求消息的消息实体(Entity Body).具体的例子参看httpRequest.txt. 

Web服务器在收到客户请求并作出处理之后,要向客户发送应答消息.与请求消息一样,应答消息的语法规则为: 


  < HTTP Version> <Status Code> [<Message>]<\r\n>  
  { <Header>:<Value> <\r\n> }   
  <\r\n>  
  { Entity Body } 


应答消息的第一行为状态行,其中包括了HTTP版本号,状态码和对状态码进行简短解释的消息;状态行的最后是回车换行.状态码由3位数字组成,有5类:  


  参看:HTTP应答码及其意义   
    
  1XX 保留   
  2XX 表示成功   
  3XX 表示URL已经被移走   
  4XX 表示客户错误   
  5XX 表示服务器错误  


例如:415,表示不支持改媒体类型;503,表示服务器不能访问.最常见的是200,表示成功.常见的报头有:Last_Modified(最后修改时间),Content_Type(消息内容的MIME类型),Content_Length(内容长度)等. 

在报头行之后也是一个回车换行,用以表示应答消息的报头部分的结束,以及应答消息实体的开始. 

下面是一个应答消息的例子:  
  HTTP/1.0 200 OK  
  Date: Moday,07-Apr-97 21:13:02 GMT  
  Server:NCSA/1.1  
  MIME_Version:1.0  
  Content_Type:text/html  
  Last_Modified:Thu Dec 5 09:28:01 1996  
  Coentent_Length:3107  
    
  <HTML><HEAD><TITLE></HTML>  
    
在用Java语言实现HTTP服务器时,首先启动一个java.net.ServerSocket在提供服务的端口上监听连接.向客户返回文本时,可以用 PrintWriter,但是如果返回二进制数据,则必须使用OutputStream.write(byte[])方法,返回的应答消息字符串可以使用 String.getBytes()方法转换为字节数组返回,或者使用PrintStream的print()方法写入文本,用 write(byte[])方法写入二进制数据. 

 

源程序来自http://blog.youkuaiyun.com/myeclipse_java,本程序是在原有基础上进行了一些调整,源程序在POST请求时会阻塞,本程序解决了此问题,另外,本程序在原有的基础上增加了文件上传与下载模拟功能:




import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.StringTokenizer;


/**
 * 
 * @author 刘长炯
 * modi by jzj
 *
 */
public class SimpleHttpServer implements Runnable {


ServerSocket serverSocket;//服务器Socket


public static int PORT = 80;//标准HTTP端口


public String encoding = "GBK";


public SimpleHttpServer() {
try {
serverSocket = new ServerSocket(PORT);
} catch (Exception e) {
e.printStackTrace();
System.exit(1);
}
new Thread(this).start();
System.out.println("HTTP服务器正在运行,端口:" + PORT);
}


public void run() {
while (true) {
try {
Socket client = serverSocket.accept();//客户机(这里是 IE 等浏览器)已经连接到当前服务器
if (client != null) {
System.out.println("连接到服务器的用户:" + client);
try {
// 第一阶段: 打开输入流
InputStream is = client.getInputStream();


System.out.println("客户端发送的请求信息: >>>>>>>>>>>>>>>>>>>>>>>>>");
// 读取第一行, 请求地址
String line = readLine(is, 0);
//打印请求行
System.out.print(line);
// < Method > < URL > < HTTP Version > <\r\n>  取的是URL部分
String resource = line.substring(line.indexOf('/'), line
.lastIndexOf('/') - 5);
//获得请求的资源的地址
resource = URLDecoder.decode(resource, encoding);//反编码 URL 地址
String method = new StringTokenizer(line).nextElement()
.toString();// 获取请求方法, GET 或者 POST
int contentLength = 0;//如果为POST方法,则会有消息体长度


// 读取所有浏览器发送过来的请求参数头部信息
do {
line = readLine(is, 0);
//如果有Content-Length消息头时取出
if (line.startsWith("Content-Length")) {
contentLength = Integer.parseInt(line.split(":")[1]
.trim());
}
//打印请求部信息
System.out.print(line);
//如果遇到了一个单独的回车换行,则表示请求头结束
} while (!line.equals("\r\n"));
//如果是POST请求,则有请求体
if ("POST".equalsIgnoreCase(method)) {
//注,这里只是简单的处理表单提交的参数,而对于上传文件这里是不能这样处理的,
//因为上传的文件时消息体不只是一行,会有多行消息体
System.out.print(readLine(is, contentLength));
System.out.println();
}


System.out.println("客户端发送的请求信息结束 <<<<<<<<<<<<<<<<<<<<<<<<<<");
System.out.println("用户请求的资源是:" + resource);
System.out.println("请求的类型是: " + method);
System.out.println();


//如果是下载文件
if (resource.startsWith("/download")) {
fileDownload("test.txt", client);
closeSocket(client);
continue;
}


// GIF 图片就读取一个真实的图片数据并返回给客户端
if (resource.endsWith(".gif")) {
imgDownload("test.gif", client);
closeSocket(client);
continue;
}


// 请求 JPG 格式就报错 404
if (resource.endsWith(".jpg")) {
PrintWriter out = new PrintWriter(client.getOutputStream(),
true);
out.println("HTTP/1.0 404 Not found");//返回应答消息,并结束应答
out.println();// 根据 HTTP 协议, 空行将结束头信息
out.close();
closeSocket(client);
continue;
} else {
// 用 writer 对客户端 socket 输出一段 HTML 代码
PrintWriter out = new PrintWriter(client.getOutputStream(),
true);
out.println("HTTP/1.0 200 OK");//返回应答消息,并结束应答
out.println("Content-Type:text/html;charset=" + encoding);
out.println();// 根据 HTTP 协议, 空行将结束头信息


out.println("<h1> Hello Http Server</h1>");
out.println("你好, 这是一个 Java HTTP 服务器 demo 应用.<br>");
out.println("您请求的路径是: " + resource + "<br>");
out.println("你请求的页面含有图片:<img src='test.gif'><br>"
+ "<a href='test.gif'>手动点击打开test.gif图片文件.</a>");
out.println("<br>服务器不支持jpg格式图片,所以显示XX:"
+ "<img src='test.jpg'><br><a href='test.jpg'>"
+ "手动点击打开test.jpg,会跳转另一页面,并且服务返回为404错误</a><br>");
out
.println("<form method=post action='/path?qryParm=POST URL查询参数' > POST 表单 "
+ "<input name=username value='用户'> "
+ "<input name=submit type=submit value=submit></form>");
out
.println("<form method=get action='/path?qryParm=GET URL查询参数' >&nbsp;GET 表单 "
+ "<input name=username value='用户'> "
+ "<input name=submit type=submit value=submit></form>");


out
.println("<form method=post action='/path?qryParm=POST URL查询参数'"
+ " enctype='multipart/form-data' >"
+ "文件上传&nbsp; <input type='file' name=file1 ><br>"
+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "
+ "<input type='file' name=file2 ><br>"
+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "
+ "<input name=username value='用户'> "
+ "<input name=submit type=submit value=submit></form>");
out.println("<a href='/download'>点击此处模拟文件下载</a>");


out.close();


closeSocket(client);
}
} catch (Exception e) {
System.out.println("HTTP服务器错误:" + e.getLocalizedMessage());
}
}
//System.out.println(client+"连接到HTTP服务器");//如果加入这一句,服务器响应速度会很慢
} catch (Exception e) {
System.out.println("HTTP服务器错误:" + e.getLocalizedMessage());
}
}
}


/*
* 这里我们自己模拟读取一行,因为如果使用API中的BufferedReader时,它是读取到一个回车换行后
* 才返回,否则如果没有读取,则一直阻塞,这就导致如果为POST请求时,表单中的元素会以消息体传送,
* 这时,消息体最末按标准是没有回车换行的,如果此时还使用BufferedReader来读时,则POST提交
* 时会阻塞。如果是POST提交时我们按照消息体的长度Content-Length来截取消息体,这样就不会阻塞
*/
private String readLine(InputStream is, int contentLe) throws IOException {
ArrayList lineByteList = new ArrayList();
byte readByte;
int total = 0;
if (contentLe != 0) {
do {
readByte = (byte) is.read();
lineByteList.add(Byte.valueOf(readByte));
total++;
} while (total < contentLe);//消息体读还未读完
} else {
do {
readByte = (byte) is.read();
lineByteList.add(Byte.valueOf(readByte));
} while (readByte != 10);
}


byte[] tmpByteArr = new byte[lineByteList.size()];
for (int i = 0; i < lineByteList.size(); i++) {
tmpByteArr[i] = ((Byte) lineByteList.get(i)).byteValue();
}
lineByteList.clear();


String tmpStr = new String(tmpByteArr, encoding);
/* http请求的header中有一个Referer属性,这个属性的意思就是如果当前请求是从别的页面链接过
* 来的,那个属性就是那个页面的url,如果请求的url是直接从浏览器地址栏输入的就没有这个值。得
* 到这个值可以实现很多有用的功能,例如防盗链,记录访问来源以及记住刚才访问的链接等。另外,浏
* 览器发送这个Referer链接时好像固定用UTF-8编码的,所以在GBK下出现乱码,我们在这里纠正一下
*/
if (tmpStr.startsWith("Referer")) {//如果有Referer头时,使用UTF-8编码
tmpStr = new String(tmpByteArr, "UTF-8");
}
return tmpStr;
}


/**
* 关闭客户端 socket 并打印一条调试信息.
* @param socket 客户端 socket.
*/
void closeSocket(Socket socket) {
try {
socket.close();
} catch (IOException ex) {
ex.printStackTrace();
}
System.out.println(socket + "离开了HTTP服务器");
}


/**
* 读取一个图像文件的内容并返回给浏览器端.
* @param fileName 文件名
* @param socket 客户端 socket.
*/
void imgDownload(String fileName, Socket socket) {


try {
PrintStream out = new PrintStream(socket.getOutputStream(), true);
File fileToSend = new File(fileName);
if (fileToSend.exists() && !fileToSend.isDirectory()) {
out.println("HTTP/1.0 200 OK");//返回应答消息,并结束应答
out.println("Content-Type: application/octet-stream");
out.println("Content-Length: " + fileToSend.length());// 返回内容字节数
out.println();// 根据 HTTP 协议, 空行将结束头信息


FileInputStream fis = new FileInputStream(fileToSend);
byte data[] = new byte[fis.available()];
fis.read(data);
out.write(data);
//文件下载完后关闭socket流,但socket还没有关闭
out.close();
fis.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}


/**
* 读取一个文件的内容并返回给浏览器端.
* @param fileName 文件名
* @param socket 客户端 socket.
*/
void fileDownload(String fileName, Socket socket) {
try {
PrintStream out = new PrintStream(socket.getOutputStream(), true);
File fileToSend = new File(fileName);
if (fileToSend.exists() && !fileToSend.isDirectory()) {
out.println("HTTP/1.0 200 OK");//返回应答消息,并结束应答
out.println("Content-Type: application/octet-stream;charset=" + encoding);


/* Content-Disposition不是标准参数,查看一下HTTP/1.1的规范文档,对于这个参数的解释大意如下:
* Content-Disposition参数本来是为了在客户端另存文件时提供一个建议的文件名,但是考虑到安全的原因,
* 就从规范中去掉了这个参数。但是由于很多浏览器已经能够支持这个参数,所以只是在规范文档中列出,但是要
* 注意这个不是HTTP/1.1的标准参数。其值为“attachment”,那么无论这个文件是何类型,浏览器都会提示我
* 们下载此文件,因为此时它认为后面的消息体是一个“附件”,不需要由浏览器来处理了。
*/
out.println("Content-Disposition: attachment;filename=测试下载文件.txt");
// out.println("Accept-Ranges: bytes");
out.println("Content-Length: " + fileToSend.length());// 返回内容字节数
out.println();// 根据 HTTP 协议, 空行将结束头信息


FileInputStream fis = new FileInputStream(fileToSend);
byte[] tmpByteArr = new byte[10];//这里为了测试看下载进度条,所以设置小点
while (fis.available() > 0) {
int readCount = fis.read(tmpByteArr);
out.write(tmpByteArr, 0, readCount);
}


//文件下载完后关闭socket流
out.close();
fis.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}


public static void main(String[] args) {
PORT = 8080;
new SimpleHttpServer();
}
}


Java用socket基于http协议搭建一个简易的http服务器 目录前言正文socket侦听localhost的端口HttpServerThread类的实现HttpServerThread类大致框架HttpServerThread类 run 方法的实现分析请求头信息尝试获取本地文件对象传输文件:发送响应包头传输文件:发送文件内容完整代码演示传输html页面传输图片404 not found 页面 前言 上一篇【Java使用socket通过http下载文件】介绍了如何模拟一个“客户端”,从指定的url下载文件,那么今天来模拟一下“服务端” 在这个十分简陋的服务端搭建完成之 阅读详情

相关推荐

牛逼,用Java Socket手撸了一个HTTP服务器

本文介绍了如何使用Java Socket编程实现一个简单的HTTP服务器。文章首先讲解了HTTP协议的基础知识,包括请求和响应的数据结构格式。然后详细阐述了基于Socket的HTTP服务器设计思路,包括请求解析、响应封装和多线程处理机制。作者通过Request和Response类封装HTTP消息,利用线程池处理并发请求,最终实现了一个支持GET/POST等基本HTTP方法的服务器。文章还提供了完整的代码示例和测试方法,帮助读者理解HTTP服务器底层原理及实现方式。该实现可作为学习HTTP协议和Socket编

sinat_25548781的博客 730

别再傻傻分不清了!嵌入式开发中Bin、Hex、S19文件到底怎么选?

本文深入解析嵌入式开发中Bin、Hex和S19三种烧录文件格式的区别与应用场景,帮助开发者根据项目需求选择最合适的格式。从基础特性到实际应用,涵盖STM32开发、汽车电子及物联网设备OTA升级等场景,提供专业的选择指南和实用技巧。

weixin_33701294的博客 719

OpenResty无损升级内嵌nginx版本0DAY漏洞

OpenResty无损升级内嵌nginx版本,nginx

qq1071643762的博客 6903

Java Sokect编程之HTTP请求

1、概述   HTTP是一种协议,全称超文本传输协议,而网页就属于超文本(就是为了它服务的),可以支持多媒体等,比如图片、音频,丰富了用户的体验;它属于网络模型中应用层的协议,底层基于TCP/IP协议,并额外制定了自己的规范,所以它也是Socket编程的一种,只是由于强大和便捷的客户端和服务端软件,常常让人看不到它的本质。   首先HTTP属于网络编程,而且是基于TCP/IP协

Noodles的博客 3982

【49】Camunda8-Self-Managed部署之Docker方式

围绕camunda8 self-managed,介绍了基于Docker部署相关服务的过程。

AlieNeny的博客 1681

Windows10内核逆向-2-KiSystemCall64的调用流程剖析

本文深入剖析了Windows 10 x64系统中KiSystemCall64函数的完整调用流程。从用户态触发syscall指令开始,详细讲解了如何通过swapgs切换内核栈、构建KTRAP_FRAME陷阱帧、进行SMAP/CFG等安全检查,到最终通过SSDT寻址并执行目标系统服务的全过程,揭示了系统调用从Ring 3到Ring 0切换的核心机制与安全设计。

weixin_29209805的博客 82

使用Socket发送HTTP请求

在java开发中有不少发送Http请求的需求,比较常见的工具类有HttpURLConnection,HttpClient和Spring中的RestTemplate,这几个类封装程度一个比一个高,越来越方便开发,更符合面向对象的编程思想.但是久而久之,也渐渐地忽略了它们背后的HTTP协议和Socket开发....

学习笔记 3735

TensorFlow_PyTorch实战:构建AI人工智能回归模型

回归分析是机器学习的核心任务之一,用于预测连续型目标变量(如房价、股票价格、用户留存时间等)。基础线性回归模型的数学原理与代码实现多项式回归模型的过拟合处理与正则化技巧自定义数据集加载与数据预处理流程动态图(PyTorch)与静态图(TensorFlow)的编程范式对比模型评估指标与可视化分析方法核心概念:对比两大框架的架构设计,解析回归模型核心组件数学原理:推导线性回归的假设函数、损失函数及优化算法算法实现:提供TensorFlow和PyTorch的完整代码示例项目实战。

AI天才研究院 1428

java socket http请求_JAVA中利用socket实现HTTP请求

一个基于java的web服务器实现主要使用这两个重要的类:java.net.Socket和java.net.ServerSocket,并通过HTTP消息进行通信。HTTP请求一个HTTP请求包括三个组成部分:1.方法—统一资源标示符(URI)—协议/版本2.请求的头部3.主体内容GET / HTTP/1.1Host: 127.0.0.1:8080Connection: keep-aliveAcce...

weixin_31822835的博客 2654

flowable工作流源码解析-DB访问

Flowable用了mybatis组件,又实现了自己的command和interceptor机制。具体是怎么实现的呢? 我们以Deployment操作为例,来看看它的调用链 调用端是Service接口, 它委托自己的commandExecutor去执行具体的Command. Command最终会调用到EntityManager,然后委托给ibatis的sqlsession来完成操作。 其中CommandExcutor调用command的地方有些复杂,我们展开看: CommandExecutor会维护一系

coobee的博客 2482

YOLO11多个点组合创新:GC10-DET缺陷检测 | DCNv4结合SPPF+11Detect创新性结合

DCNv4结合SPPF+11Detect创新性结合,原始mAP50为0.633 提升至0.651

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 1287

使用java socket完成一个简单的http服务器解析Get请求

java

qq_41103091的博客 1147

全国区块链职业技能大赛国赛考题前端功能开发

全国区块链职业技能大赛国赛考题区块链应用前端功能开发

本郡主是喵 1333

java socket http_记_Java Socket现实简单的HTTP服务(http协议,80端口)

HTTP服务器正在运行,端口:8080连接到服务器的用户:Socket[addr=/0:0:0:0:0:0:0:1,port=56155,localport=8080]客户端发送的请求信息: >>>>>>>>>>>>>>>>>>>>>>>>>GET ...

weixin_29901799的博客 275

微信小程序云开发 - 实现商家转账到零钱(微信企业付款到零钱) V3功能流程及完整实例代码,过微信云开发的云函数实现企业付款到零钱(提供详细示例源码纯云函数实现,证书、密钥、签名等各种常见问题解决方案

企业付款到零钱(微信小程序提现功能,提现到零钱)微信小程序-云函数实现微信企业付款到零钱功能,实现微信商户号中的企业付款到零钱的功能,微信小程序+云开发+商家转账至零钱+微信小程序用户提现,使用云开发环境的云函数实现微信小程序的支付功能,微信小程序实现微信企业付款到零钱功能的流程,V3 V2基于微信云开发的商家转账至零钱,小程序云函数企业付款到零钱功能实现,云开发实现微信商户支付企业付款到零钱功能,不用服务器纯云函数实现,详细示例代码demo教程,API证书错误,转账不到账怎么办,密钥生成有误,转账失败,有

🏆 前端领域优质创作者 1万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

用Java Socket手撸了一个HTTP服务器

这一块需要注意一点,正文可能为空,也可能有数据;有数据时,我们要如何把所有的数据都取出来呢?

恒二哥的博客 2035

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

JAVA编写的一个简单的Socket实现的HTTP响应服务器

JAVA编写的一个简单的Socket实现的HTTP响应服务器,看后就很容易理解Web服务器的原理了。 package test.io; import java.net.*; import java.io.*; /** * 一个简单的Socket实现的HTTP响应服务器。 * 只用于熟悉HTTP协议的目的,可以看到浏览器发过来的数据格式。 * * @author */ publ

雷霄骅(leixiaohua1020)的专栏 7946

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Java 简单实现HTTP服务器

HTTP服务器   解释: 个人理解,http服务器就是解析http请求信息,并解析信息;然后根据信息做后续事情。   Http请求格式与响应格式      核心代码     package com_2.Httpserver; import java.io.BufferedReader; import java.io.IOException; import java.i...

Dachuan 1万+

利用Java Socket编写一个简单的Web服务器

1-2 利用Java Socket编写一个简单的Web服务器,具体如下: (1)、使用 ServerSocket 监听某一端口,然后等待连接获取 Socket对象; (2)、创建一个类 HttpServer 继承 java.lang.Thread 类,重写 run()方法,执行浏览器请求; (3)、获得浏览器请求,解析资源文件路径; (4)、读取资源文件,响应给浏览器; (5)、浏览器地址栏输入: http://localhost:8000/index.html; (6)、效果如下: 代码: 启动类 pu

Jackyyl729的博客 7605

基于Java实现简单Http服务器之一

        本文将详细介绍如何基于java语言实现一个简单的Http服务器,文中将主要介绍三个方面的内容:1)Http协议的基本知识、2)java.net.Socket类、3)java.net.ServerSocket类,读完本文后你可以把这个服务器用多线程的技术重新编写一个更好的服务器。         由于Web服务器使用Http协议通信的因此也把它叫做Http服务器,Http使用可靠

mingjava的专栏 4952

java socket http服务器_使用Java Socket手撸一个http服务器

作为一个java后端,提供http服务可以说是基本技能之一了,但是你真的了解http协议么?你知道知道如何手撸一个http服务器么?tomcat的底层是怎么支持http服务的呢?大名鼎鼎的Servlet又是什么东西呢,该怎么使用呢?在初学java时,socket编程是逃不掉的一章;虽然在实际业务项目中,使用这个的可能性基本为0,本篇博文将主要介绍如何使用socket来实现一个简单的http服务器功...

weixin_42316952的博客 1101

java socket 模拟 http_java Socket实现简单模拟HTTP服务器

最近复习计算机网络,复习完应用层之后对于理论知识还是没有一个深刻的概念,索性就动手用Java Socket API 模拟做一个HTTP服务器,巩固一下应用层的知识。HTTP基于TCP协议,协议采用了请求/响应模型。客户端向服务器发送一个请求,请求头包含请求的方法、URL、协议版本、以及包含请求修饰符、客户信息和内容的类似于MIME的消息结构。服务器以一个状态行作为响应,响应的内容包括消息协议的版本...

weixin_39865440的博客 460
上一篇: Java中Comparable与Comparator的区别
下一篇: 打印堆栈信息
lin___
博客等级 码龄12年 23粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值