创建服务器:ServerSocket

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 创建服务器,并启动
*/
public class Server {
private ServerSocket server;//创建服务器需要ServerSocket类。 public static void main(String[] args) {
Server server = new Server();//必须创建本类的对象调用该类的方法。
server.start();
} /**
* 启动服务器方法
*/
public void start(){
try {
server = new ServerSocket();//服务器启动起来了,
this.receive();//等待接收客户端的信息,
} catch (IOException e) {
e.printStackTrace();
}
} /**
* 接收客户端
*/
private void receive(){
try {
Socket client =server.accept();//等待客户端的连接,当在浏览器中输入localhost:8888则会进入下面的方法。
//接收客户端的请求信息
StringBuilder sb =new StringBuilder();
String msg =null;
BufferedReader br = new BufferedReader(
new InputStreamReader(client.getInputStream())
);
while((msg=br.readLine()).length()>){
sb.append(msg);
sb.append("\r\n");
} String requestInfo =sb.toString().trim();
System.out.println(requestInfo);
/**下面就是http协议:
*
* GET / HTTP/1.1
* Host: localhost:8888
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/34.0.1847.116 Safari/537.36
Accept-Encoding: gzip,deflate,sdch
Accept-Language: zh-CN,zh;q=0.8
*/ } catch (IOException e) {
}
} /**
* 听着服务器
*/
public void stop(){
}
} html语言:超文本标记语言,因为它也是一个文本,实际上就是一个字符串,但是有标签和格式。
<html>
<head>
<title>第一个表单</title>
</head>
<body>
<pre>
method:请求方式 get/post
get: 默认方式,数据量小,安全性不高
post:量大,安全性相对高
action:请求的服务器路径
id:编号,前端区分唯一性 ,js中使用
name:名称,后端(服务器)区分唯一性 ,获取值
只要提交数据给后台,必须存在name
</pre>
<form method="post" action="http://localhost:8888/index.html">
用户名:<input type="text" name="uname" id="uname"/>
密码:<input type="password" name="pwd" id="pwd"/>
<input type="submit" value="登录"/>
</form>
</body>
</html> 再建立一个java程序的服务器,上述表单提交后则会进入下面的Java代码。
读取数据的第二种方式:用字节数组接收。 private void receive(){
ServerSocket server = new ServerSocket();
try {
Socket client =server.accept();
byte[] data=new byte[];
int len =client.getInputStream().read(data);//通过字节一次性读取
//接收客户端的请求信息
String requestInfo=new String(data,,len).trim();
System.out.println(requestInfo);
} catch (IOException e) {
}
} 协议:协议就是规范。
应用层:HTTP FTP TELNET SNMP DNS
传输层:TCP UDP
网络层:IP
主机-网络层 以太网 IEEE802. 令牌环网:IEEE802.
HTTP:超文本传输协议,是网络中应用层的协议,建立在tcp、ip的基础上,所以传输的时候就要借助socket,http协议是使用可靠的tcp连接,默认的端口是80,目前最新的版本是1.,对应的RFC文档是RFC2068,下载网址www.ietf.org/rfc/rfc2068.txt. 常见的HTTP客户端是浏览器,http遵循请求-相应模型(Request-Response)。HTTP协议规定了http客户端和服务器发送接收数据的严格格式。
浏览器就是http客户端,发送的请求遵循严格的http协议要求的请求格式。
请求格式如下:
GET / HTTP/1.1(请求方式)
Host: localhost:
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/34.0.1847.116 Safari/537.36
Accept-Encoding: gzip,deflate,sdch
Accept-Language: zh-CN,zh;q=0.8 http协议规定,请求由3部分组成,分别是:
-请求方式 URI(统一资源定位符,就是请求的资源名字) http协议版本
-一系列请求的头信息
-请求正文(post方式才有,get方式没有)
请求头信息和请求正文必须有换行,换行符就是区分请求头个请求正文的。 http响应格式:也是由3部分组成。
-http协议的版本 状态代码 描述(200表示OK,500表示系统内部错误,404表示找不到)
-响应头(正文长度是字节长度,比如112,表示只有112个字节,浏览器读到112个字节就不读了。)
-响应正文 /**
* 创建服务器,并启动
* 1、请求
* 2、响应
*/
public class Server3 {
private ServerSocket server;
public static final String CRLF="\r\n";
public static final String BLANK=" ";
public static void main(String[] args) {
Server3 server = new Server3();
server.start();
}
/**
* 启动方法
*/
public void start(){
try {
server = new ServerSocket();
this.receive();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 接收客户端
*/
private void receive(){
try {
Socket client =server.accept();//此处会阻塞,浏览器中输入http://localhost:8888 即可进入这个方法进行访问。
byte[] data=new byte[];
int len =client.getInputStream().read(data);
//接收客户端的请求信息
String requestInfo=new String(data,,len).trim();
System.out.println(requestInfo);
/*
* GET / HTTP/1.1
Host: localhost:8888
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/34.0.1847.116 Safari/537.36
Accept-Encoding: gzip,deflate,sdch
Accept-Language: zh-CN,zh;q=0.8*/
//响应正文
StringBuilder responseContext =new StringBuilder();
responseContext.append("<html><head><title>HTTP响应示例</title>" +
"</head><body>Hello bjsxt!</body></html>");
StringBuilder response =new StringBuilder();
//1) HTTP协议版本、状态代码、描述
response.append("HTTP/1.1").append(BLANK).append("").append(BLANK).append("OK").append(CRLF);
//2) 响应头(Response Head)
response.append("Server:bjsxt Server/0.0.1").append(CRLF);
response.append("Date:").append(new Date()).append(CRLF);
response.append("Content-type:text/html;charset=GBK").append(CRLF);
//正文长度 :字节长度
response.append("Content-Length:").append(responseContext.toString().getBytes().length).append(CRLF);
//3)正文之前
response.append(CRLF);
//4)正文
response.append(responseContext);
System.out.println(responseContext);
//输出流
//前面的字符串是按照http响应的格式,所以这里浏览器会识别接收。
//返回一个流给浏览器,只要这个流中的字符串满足http响应的格式就能被浏览器解析,因为浏览器是http的客户端。
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
bw.write(response.toString());//把response写出去。
bw.flush();
bw.close();
} catch (IOException e) {
}
} /**
* 听着服务器
*/
public void stop(){
}
} HTTP响应分析:
http应答码由3位数字构成,首位定义了应答码的类型。、
-1XX 表示收到web浏览器请求,正在进一步处理;
-2XX 成功
-3XX 表示请求没有成功,客户必须采取进一步动作;
-4XX 客户端错误,404没找到
-5XX 服务器错误,不能完成对请求的处理; 响应头:例如服务器类型、日期时间、正文类型、正文长度。 正文类型、正文长度很重要,类型如下:
Content-type:text/html;charset=GBK(超文本)
Content-type:text/plain;charset=GBK(普通文本)
content-type:application/octet-stream(流,用于下载) 响应头和响应正文之间必须用\r\n分开。

java20 创建服务器:ServerSocket的更多相关文章

  1. SQLServer 创建服务器和数据库级别审计

    概述 在上一篇文章中已经介绍了审计的概念:本篇文章主要介绍如何创建审计,以及该收集哪些审核规范. 一.常用的审核对象 1.1.服务器审核对象 1.FAILED_LOGIN_GROUP( Audit L ...

  2. node.js和express创建服务器

    创建web服务器 一. 使用node.js创建服务器. 使用express创建http服务. 监控服务器的变化. 二. 初始化配置文件:npm init -y 使用typescript编写,导入nod ...

  3. SQL Server 创建服务器和数据库级别审计

    一.概述 在上一篇文章中已经介绍了审计的概念:本篇文章主要介绍如何创建审计,以及该收集哪些审核规范. 二.常用的审核对象 2.1.服务器审核对象 1.FAILED_LOGIN_GROUP( Audit ...

  4. Node.js创建服务器和模拟客户端请求

    1. 何为服务器 服务器是某种长期运行,等待请求资源的应用程序 2. 常见Web应用架构 3. 如何创建web服务器 Web服务器是使用HTTP协议,等待客户端连接后请求资源的驻守应用程序:HTTP协 ...

  5. weblogic创建控制台启动脚本以及创建服务器

    一.创建控制台脚本 二.创建认证文件 通过上面创建的脚本进行启动的时候,会因为密码问题导致起不来,因为在startWebLogic.sh文件中,没有配置用户名和密码.而且通过上面创建的脚本,启动的时候 ...

  6. node.js中使用http模块创建服务器和客户端

    node.js中的 http 模块提供了创建服务器和客户端的方法,http 全称是超文本传输协议,基于 tcp 之上,属于应用层协议. 一.创建http服务器 const http = require ...

  7. node.js中net模块创建服务器和客户端(TCP)

    node.js中net模块创建服务器和客户端 1.node.js中net模块创建服务器(net.createServer) // 将net模块 引入进来 var net = require(" ...

  8. node创建服务器

    //引入核心模块 const http = require('http'); //创建服务器 http.createServer((req,res)=>{ }).listen(3000); // ...

  9. 使用express框架创建服务器

    上一篇写创建第一个node服务器是基于原始方法写的,express框架的作用就是省掉那些原始代码,直接调用相关的方法就可以了,开发起来简单方便. 一.package.json的配置 首先要进行pack ...

随机推荐

  1. ANDROID_MARS学习笔记_S01原始版_013_广播机制二

    一.代码1.xml(1)main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayo ...

  2. VC 透明滑动控件Slider Control

    操作系统:Windows 7软件环境:Visual C++ 2008 SP1本次目的:为滑动控件设置背景透明 经常在编写有背景的程序时,滑动控件Slider Control看起来与背景十分不合,我们可 ...

  3. Yii url createUrl redirect相关

    一篇文章: 在yii中明明白白生成网址: 在Yii中经常要生成URL,不管是为了自动跳转还是仅仅是一个链接.下面对Yii中的URL生成做了一个总结.提示:以下controllerX代表控制器X,act ...

  4. Binary to Text (ASCII) Conversion

    Binary to Text (ASCII) Conversion Description: Write a function that takes in a binary string and re ...

  5. Android开发之bindService()侦听service内部状态

    在Android开发之bindService()通信的基础上,实现bindService()方法侦听service内部状态. 实现侦听service内部状态,使用的是回调机制 1.首先实现一个接口 p ...

  6. poj3373Changing Digits(dp)

    链接 dfs倒着搜 返回的路径不能满足相同的数最多 借鉴了下别人的代码.. 先dp出来 再倒着标记一下 然后正回来一定可以满足了 dp保存的是最小的不相同数 #include <iostream ...

  7. VI编辑器的使用方法

    一.vi的工作模式vi有两种工作模式:  编辑模式:用来输入和编辑文件的模式,屏幕上会显示用户的键入,按键不是被解释为命令执行,而是作为文本写到用户的文件中.  指令模式:用来编辑.存盘和退出文件的模 ...

  8. spring(6)--注解式控制器

    6.1.注解式控制器简介 一.Spring2.5之前,我们都是通过实现Controller接口或其实现来定义我们的处理器类.已经@Deprecated.   二.Spring2.5引入注解式处理器支持 ...

  9. FAQ_浏览器_ChromeDriver报错

    Started ChromeDriverport=2437version=23.0.1240.0log=D:\workspace\WebdriverTest\chromedriver.log[0704 ...

  10. 配置Memcache服务器并实现主从复制功能(repcached)(转)

    1.repcached介绍repcached 是日本人开发的实现memcached复制功能,它是一个单 master单 slave的方案,但它的 master/slave都是可读写的,而且可以相互同步 ...