这里写自定义目录标题
socket
套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议根进行交互的接口
代码1
package com.icss.itomcat;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
public class WorkThread implements Runnable {
// 保存当前套接字
private Socket socket;
public WorkThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
// TODO Auto-generated method stub
// 处理请求数据和发送响应数据
try {
InputStream in = this.socket.getInputStream(); // 输入流,读取请求数据
OutputStream out = this.socket.getOutputStream();// 输出流,发送响应数据
// 读取请求头
String requestHeader = "";// 保存请求
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String line = null;
while ((line = br.readLine()) != null && line.length() > 0) {
requestHeader += line + "\r\n";
}
// 解析请求头
String[] headers = requestHeader.split("\r\n");
String url = headers[0].split(" ")[1];
if(url.equals("/index.html")) { // 如果请求index.html
String filePath = this.getClass().getResource("/").getPath();
File file = new File(filePath + "index.html");
StringBuilder sb=new StringBuilder();
sb.append("HTTP/1.0 200 OK\r\n");
sb.append("Content-Type: text/html;charset=utf-8\r\n");
sb.append("X-Ua-Compatible: IE=Edge,chrome=1\r\n");
String path = this.getClass().getResource("/").getPath();
System.out.println(path);
BufferedReader reader = null;
StringBuffer sbf = new StringBuffer();
try {
reader = new BufferedReader(new FileReader(file));
String tempStr;
while ((tempStr = reader.readLine()) != null) {
sbf.append(tempStr);
}
reader.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
sb.append("Content-length: ").append(sbf.toString().getBytes().length).append("\r\n");
sb.append("\r\n");
System.out.println(sb.append(sbf.toString()));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(out));
bw.write(sb.toString());
bw.flush();
} else if (url.equals("/tomcat.png")) { // 图片 tomcat.png
StringBuilder sb=new StringBuilder();
sb.append("HTTP/1.0 200 OK\r\n");
sb.append("Content-Type: image/png\r\n");
sb.append("X-Ua-Compatible: IE=Edge,chrome=1\r\n");
String path = this.getClass().getResource("/").getPath();
System.out.println(path);
String fileName = path + "tomcat.png";
File file = new File(fileName);
DataInputStream fis=new DataInputStream(new BufferedInputStream(new FileInputStream(file)));
byte[] theData=new byte[(int)file.length()];
fis.readFully(theData);
fis.close();
sb.append("Content-length: ").append(theData.length).append("\r\n");
sb.append("\r\n");
System.out.println(sb.toString());
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(out));
bw.write(sb.toString());
bw.flush();
out.write(theData);
out.flush();}
else {
// 实现最简单的应答
String responseHeader = "";// 封装应答头
String responseContent = "<html><head></head>" + "<body>欢迎访问 小Q达人 的个人主页" + "</body></html>";// 封装应答内容
responseHeader += "HTTP/1.1 200 OK\r\n";
responseHeader += "Content-Type: text/html;charset=utf-8/r/n";
responseHeader += "Content-length:" + responseContent.getBytes().length + "\r\n";
responseHeader += "\r\n";
String content = responseHeader + responseContent;
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(out));
bw.write(content);
bw.flush();
}
in.close();
out.close();
socket.close();
System.out.println(requestHeader);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
}
}
}
代码2
package com.icss.itomcat;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class HttpServer extends Thread {
// 服务器监听socket
private ServerSocket serverSocket;
public HttpServer(int port) {
try {
this.serverSocket = new ServerSocket(port);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void run() {
while (true) {
try {
// 监听连接,返回当前连接的套接字
System.out.println("服务器启动成功");
Socket clientSocket = this.serverSocket.accept();
//启动子线程,处理当前的socket请求
WorkThread wt=new WorkThread(clientSocket);
new Thread(wt).start();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void main(String[] args) {
new HttpServer(80).start();
}
}
代码实现
链接: link.
图片:
带尺寸的图片:
居中的图片:
居中并且带尺寸的图片:
当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。
如何插入一段漂亮的代码片
去博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片
.
// An highlighted block
var foo = 'bar';
生成一个适合你的列表
- 项目
- 项目
- 项目
- 项目
- 项目1
- 项目2
- 项目3
- 计划任务
- 完成任务
创建一个表格
一个简单的表格是这么创建的:
项目 | Value |
---|---|
电脑 | $1600 |
手机 | $12 |
导管 | $1 |
设定内容居中、居左、居右
使用:---------:
居中
使用:----------
居左
使用----------:
居右
第一列 | 第二列 | 第三列 |
---|---|---|
第一列文本居中 | 第二列文本居右 | 第三列文本居左 |
SmartyPants
SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:
TYPE | ASCII | HTML |
---|---|---|
Single backticks | 'Isn't this fun?' | ‘Isn’t this fun?’ |
Quotes | "Isn't this fun?" | “Isn’t this fun?” |
Dashes | -- is en-dash, --- is em-dash | – is en-dash, — is em-dash |
创建一个自定义列表
-
Markdown
- Text-to- HTML conversion tool Authors
- John
- Luke
如何创建一个注脚
一个具有注脚的文本。1
注释也是必不可少的
Markdown将文本转换为 HTML。
KaTeX数学公式
您可以使用渲染LaTeX数学表达式 KaTeX:
Gamma公式展示 Γ ( n ) = ( n − 1 ) ! ∀ n ∈ N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N Γ(n)=(n−1)!∀n∈N 是通过欧拉积分
Γ ( z ) = ∫ 0 ∞ t z − 1 e − t d t . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)=∫0∞tz−1e−tdt.
你可以找到更多关于的信息 LaTeX 数学表达式here.
新的甘特图功能,丰富你的文章
- 关于 甘特图 语法,参考 这儿,
UML 图表
可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图:
这将产生一个流程图。:
- 关于 Mermaid 语法,参考 这儿,
FLowchart流程图
我们依旧会支持flowchart的流程图:
- 关于 Flowchart流程图 语法,参考 这儿.
导出与导入
导出
如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。
导入
如果你想加载一篇你写过的.md文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。
注脚的解释 ↩︎