需求:设计一个注冊网页用于录入username和登录password。并将数据传入server并显示出来。

1、前言:网页提交的 get 和 post 两种方式。

  (1)对于get提交方式,以本文中样例为例。server接收到的完整信息为:

</pre><pre name="code" class="java"><span style="font-size:14px;">GET /?

username=admin&password=admin HTTP/1.1(请求头和请求体在一起)
Accept(表示可以接受的类型): application/x-shockwave-flash, image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
Accept-Language: zh-cn(表示接收的为中文)
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; InfoPath.2)
Accept-Encoding(接收编码): gzip(压缩程序), deflate
Host: 192.168.3.100:10000(server的IP及port号)
Connection: Keep-Alive(保持连接)
</span>

  我们发送的实质数据(username=admin&password=666)称为请求体,其他的称为请求头,能够发现get方式是将请求体放在了请求头内部。由于请求头和请求体就像文章的标题和内容一样。标题必然不能有太多数据,而内容数据大小却没有限制。

所以请求头数据容量非常小。一般仅仅有8k,所以假设将请求体放在请求头内部时。不能用于传输图片、音频、视频等大型数据,而放在请求头外部则对数据大小没有限制。

  所以能得出 get 方式提交特点为:数据有限制,可是由于放在了请求头,首先被提交。所以提交速度非常快这个和网络传输中的UDP协议(请猛点这里)特点非常类似。

  get方式提交另一个缺点就是:被提交的内容会在地址栏中显示。如:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

  (2)对于 post 提交方式,以本文中样例为例,server接收到的完整信息为:

<span style="font-size:14px;">POST / HTTP/1.1(我是请求头開始)
Accept: application/x-shockwave-flash, image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
Accept-Language: zh-cn
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; InfoPath.2)
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
Host: 192.168.3.100:10000
Content-Length: 29
Connection: Keep-Alive
Cache-Control: no-cache(我是请求头结束) username=admin&password=admin(我是请求体) </span>

  能够看见,post方式中请求头和请求体是分开的,中间隔了两个空行(说明隔了两个“ / r / n”。这将是后面server提取请求体内容的重要根据) 。由于请求体中的数据大小没有限制。所以post提交方式的特点为:

  特点:传输数据大小无限制,可是传输速度慢。并且没有地址栏暴露用户信息的缺陷。

2、设计网页

<span style="font-size:14px;"><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"> <span style="font-family: Arial, Helvetica, sans-serif;"><!-- 这个页面的头部表示了w3c的规范信息。 --></span> <head>
<meta http-equiv="Content-Type" content="text/html; charset=GBK" />
<title>用户登录</title>
</head>
<body> <form action="http://192.168.3.100:888888" method="post"> //表示将要訪问IP地址为<span style="font-family: Arial, Helvetica, sans-serif;">192.168.3.100的server上port为888888的应用程序,这里设置为post 方式提交</span> <table border="1" align="center" width="40%">
<caption>用户登录</caption>
<tr>
<td>用户名:</td>
<td>
<input type="text" name="username" id="username" /> //文本框用于输入文本
</td>
</tr>
<tr>
<td>密码:</td>
<td>
<input type="password" name="password" id="password" /> //密码框用于输入密码
</td>
</tr>
<tr>
<td>邮箱:</td>
<td>
<input type="text" name="email" id="email" />
</td>
</tr>
<tr>
<td colspan="2" align="center"> //合并两列,格式为居中
<input type="submit" value="登录" /> //提交button,值设为登录
    
<input type="reset" value="重置" /> //重置button
</td>
</tr>
</table>
</form>
</body>
</html>
</span>

  实现网页效果为:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

3、自己定义server(如果我输入的username为admin。password为666)

<span style="font-size:14px;">public class LoginServer {
public static void main(String[] args) throws IOException {
// 创建serverSocket对象,port设置为888888
ServerSocket ss = new ServerSocket(888888); // 监听client连接
Socket s = ss.accept();
System.out.println("连接成功"); //假设有对象成功连接到server。输出信息提示 // 获取输入流
InputStream is = s.getInputStream();
byte[] bys = new byte[1024]; //用字符数组接收,大小设置为1024字节
int len = is.read(bys); //定义len为每次实际读到的内容长度
String data = new String(bys, 0, len); //由于是post方式提交,所以此处得到的data内容是标题1中post方式提交server得到的完整数据状态 //由于post提交,请求体通过连续两次的\r\n和请求头隔开,而我们须要的数据是请求体。 所以我们获取请求体内容步骤为:
int index = data.indexOf("\r\n\r\n"); //<span style="font-family: Arial, Helvetica, sans-serif;">首先获取连续两次的\r\n的索引位置</span>
String newData = data.substring(index+4); //获得请求体。此时newData实际内容为:<span style="font-family: Arial, Helvetica, sans-serif;">username=admin&password=666</span> //将请求体分解
String username = getParameter("username",newData); //调用<span style="font-family: Arial, Helvetica, sans-serif;">getParameter方法获取newData中的username内容</span>
String password = getParameter("password",newData); //<span style="font-family: Arial, Helvetica, sans-serif;">调用</span><span style="font-family: Arial, Helvetica, sans-serif;">getParameter方法获取newData中的password内容</span>
String email = getParameter("email",newData); //<span style="font-family: Arial, Helvetica, sans-serif;">调用</span><span style="font-family: Arial, Helvetica, sans-serif;">getParameter方法获取newData中的email内容</span> //获取输出流。在网页中返回信息
PrintWriter pw = new PrintWriter(s.getOutputStream(),true); //得到打印流对象
pw.println("用户登录成功<br/>"); //在网页中输出登陆成功提示
pw.println("用户名是:<font color=red>"+username+"</font><br/>"); //显示用户注冊名
pw.println("密码是:"+password+"<br/>"); //显示用户注冊密码
pw.println("邮箱是:"+email+"<br/>"); //显示用户注冊邮箱 pw.close(); //关闭打印流对象,由于server须要全天候处于开启状态。所以不关闭socket对象
} private static String getParameter(String key, String newData) { //自己定义getParameter方法。用于获取请求体中的对象
String[] datas = newData.split("&"); //将数据按&分为两部分并存入datas数组中,当中datas[0]=(username=admin)。datas[1]=(password=666)
for(String data : datas){ //增强for遍历datas数组
//username=admin
String[] keyAndValue = data.split("="); //根据“=”进行数据拆分
if(keyAndValue[0].equals(key)){ //根据传入參数进行匹配
return keyAndValue[1];
}
}
return null; //假设没有则返回null
}
}
</span>

  小结:网页数据提交主要有get和post两种方式。其各有利弊。get主要特点为速度快。容量小;post主要特点为速度慢,容量大。另外。在进行数据传送之前,要注意首先保证server已经开启并处于监听状态。

设计网页录入信息与自己定义server数据接收的更多相关文章

  1. php获取网页header信息的4种方法

    php获取网页header信息的方法多种多样,就php语言来说,我知道的方法有4种, 下面逐一献上. 方法一:使用get_headers()函数 推荐指数: ★★★★★ get_header方法最简单 ...

  2. 在 Apache error_log 中看到多个信息,提示 RSA server certificate CommonName (CN) 与服务器名不匹配(转)

    在 Apache error_log 中看到多个信息,提示 RSA server certificate CommonName (CN) 与服务器名不匹配. Article ID: 1500, cre ...

  3. Python 网页投票信息抓取

    最近学习python,为了巩固一下学过的知识,花了半天(主要还是因为自己正则表达式不熟)写了个小脚本来抓取一个网站上的投票信息,排名后进行输出. 抓取的网站网址是http://www.mudidi.n ...

  4. 斗地主算法的设计与实现--项目介绍&如何定义和构造一张牌

    本篇主要讲解斗地主中如何比较两手牌的大小. 友情提示:本篇是接着以下两篇文章就讲解的,建议先看看下面这2篇. 斗地主算法的设计与实现--如何判断一手牌的类型(单,对子,三不带,三带一,四代二等) 斗地 ...

  5. 使用JavaScript实现录入信息生成名片

    首先是布局: 一个大的盒子模型套两个小的盒子模型:左边是录入信息生成界面,右边是名片显示界面. 框架: 这里新建一个css文件,用于外部链接使用装饰 /*最外层div,主框架*/ .frame{ wi ...

  6. 熟练使用jquery ui / easyui的各种组件设计网页界面

    熟练使用jquery ui / easyui的各种组件设计网页界面

  7. [从源码学设计]蚂蚁金服SOFARegistry 之 LocalDataServerChangeEvent及数据同步

    [从源码学设计]蚂蚁金服SOFARegistry 之 LocalDataServerChangeEvent及数据同步 目录 [从源码学设计]蚂蚁金服SOFARegistry 之 LocalDataSe ...

  8. (Sql Server)数据的拆分和合并

    (Sql Server)数据的拆分和合并 背景: 今天遇到了数据合并和拆分的问题,尝试了几种写法.但大致可分为两类:一.原始写法.二.Sql Server 2005之后支持的写法.第一种写法复杂而且效 ...

  9. C#高级编程四十一天----用户定义的数据类型转换

    用户定义的数据类型转换 C#同意定义自己的 数据类型,这意味着须要某些 工具支持在自己的数据类型间进行数据转换.方法是把数据类型转换定义为相关类的一个成员运算符,数据类型转换必须声明为隐式或者显式,以 ...

随机推荐

  1. C#高级编程八十三天----程序集的含义

    程序集的含义 一.程序集是包括一个或多个类型定义文件和资源文件的集合.它同意我们分析可重用类型的逻辑表示和物理表示. 相当于你定义了一个项目XXProject,项目存在非常多文件(类,窗口,接口,资源 ...

  2. VMWare虚拟机下为Ubuntu 12.04.1网络设置(NAT方式)

    NAT方式: 虚拟机能够上外网,能够訪问宿主计算机所在网络的其它计算机(反之不行). 第一步:设置虚拟机vmware网络參数 (1)打开虚拟机,选择菜单"编辑">" ...

  3. Flask + mod_wsgi + Apache on Windows 部署成功(随时接受提问)

    前言 说是前言,纯粹就是吐槽. 假设你赶时间.全然能够跳过这部分,我保证不会在这里隐藏不论什么实用的内容. 人上年纪后.可能冲劲不足,我花了大概两周的时间才成功的将flask部署到windows上.还 ...

  4. clipper库使用的一些心得

    clipper sourceforge官网:http://sourceforge.net/projects/polyclipping/ 1. 版本号差异 之前project里面使用4.8.6,近期升级 ...

  5. unity3d面试题摘选(全)

    ======================================= 数据结构和算法非常重要.图形学也非常重要! 大的游戏公司非常看重个人基础.综合能力.也有的看重你实际工作能力,看你的De ...

  6. Java-2-学习历程2:基础知识1,2,3文档、完整版视频资源、电子书籍下载

     Java学习历程:基础知识1,2,3文档.完整版视频资源.电子书籍 1.基础知识1,2.3可到下面地址下载: http://download.csdn.net/detail/iot_li/886 ...

  7. 光标属性CSS cursor 属性

    CSS cursor 属性 CSS cursor属性,以前不知道,如果以后用到自己看的 <html> <body> <p>请把鼠标移动到单词上,可以看到鼠标指针发生 ...

  8. QT-helloworld-QtCreater编写

    前言:纯代码编写helloworld,解析代码含义. 一.新建空项目 新建->其他项目->Empty qmake Project 二.修改.pro文件 打开helloworld.pro文件 ...

  9. ffmpeg键盘命令响应程序详解

    一.对终端进行读写 当一个程序在命令提示符中被调用时, shell负责将标准输入和标准输出流连接到你的程序, 实现程序与用户间的交互.   1. 标准模式和非标准模式 在默认情况下, 只有用户按下回车 ...

  10. Spark SQL 编程API入门系列之Spark SQL支持的API

    不多说,直接上干货! Spark SQL支持的API SQL DataFrame(推荐方式,也能执行SQL) Dataset(还在发展) SQL SQL 支持basic SQL syntax/Hive ...